2013-06-18 99 views
0

我遇到以下下面的代码错误,基本上下面就是我要做的,我该怎么修改我的代码,而无需改变原有的目标...类型错误:unhashable类型:“名单”

  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() 
    

OUTPUT: -

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' 

回答

5

在这个表达式中的变量v

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

是与剩余的值的列表。您无法使用列表来索引字典,因此:

del dic[v] 

将会失败。看代码逻辑,你可能想要这么做:

for value in v: 
    if .... 
     del dic[value] 
3

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

相关问题