0

我在下面的代码中遇到了以下错误,基本上下面是我想要做的,我怎样才能在不改变原始目标的情况下修改我的代码......

  1. 如果任何值是没有值的键,则从输入中删除该行
  2. 如果任何值是具有值的键,则对于每个值(即键)递归检查其值,直到没有值并删除重复行...示例输入和输出如下所示:

        KEY    VALUES
        353311
        344670 
        332807 353314
        338169 334478
        334478 123456 34567
        123456 98670
        34567  11111  
        353314 353311
        348521 350166 350168 350169 350170 
        350166 348521
        350168 348521
        350169 348521
        350170 348521
    
        EXPECTED OUTPUT
        344670
        332807 353314 353311
        338169 334478 123456 34567 98670 11111
        348521 350166 350168 350169 350170  
    

    代码:-

    from collections import OrderedDict
    def main ():
    
        with open('gerrit_dependencylist.txt') as f:
            dic = OrderedDict()
            seen = set()
            for line in f:
                #print dic,line
                spl = line.split()
                #print "SPL"
                #print spl
                if len(spl) == 1:
                    key = spl[0]
                    v = ''
                else:
                    print "LINE"
                    print line
                    key, v = spl[0], spl[1:]        
                for value in v:
                    if value in dic and dic[value] == [""]:
                        del dic[v]
                for k1,v1 in dic.iteritems():
                    if key in v1:
                        dic[k1].append(v)
                        break
                else:
                    dic[key] = [v]
    if __name__ == '__main__':
        main()
    

输出:-

    LINE
    332807 353314

    LINE
    338169 334478

    LINE
    334478 123456 34567

Traceback (most recent call last):
  File "tesst.py", line 29, in <module>
    main()
  File "tesst.py", line 21, in main
    del dic[v]
  File "/usr/lib/python2.7/collections.py", line 67, in __delitem__
    dict_delitem(self, key)
TypeError: unhashable type: 'list'
4

2 回答 2

5

此表达式中的变量v

key, v = spl[0], spl[1:]

是一个包含剩余值的列表。您不能使用列表来索引字典,因此:

del dic[v]

将失败。查看代码逻辑,您可能还是想这样做:

for value in v:
   if ....
       del dic[value]
于 2013-06-18T15:39:18.013 回答
3

您正在尝试使用列表作为键来索引字典。将错误中的行替换为del dic[v]-del dic[value]假设这就是您的意思。

于 2013-06-18T15:37:43.797 回答