2015-11-19 36 views
3

我正在写一个函数,它接受字典输入并返回在该字典中具有唯一值的键的列表。考虑,keyerror 1在我的代码

ip = {1: 1, 2: 1, 3: 3} 

因此,输出应该是[3],因为关键字3具有唯一的值,这是不存在的字典。

现在有问题给出功用:

def uniqueValues(aDict): 

    dicta = aDict 
    dum = 0 
    for key in aDict.keys(): 

     for key1 in aDict.keys(): 

      if key == key1: 
       dum = 0 
      else: 
       if aDict[key] == aDict[key1]: 
        if key in dicta: 
         dicta.pop(key) 
        if key1 in dicta: 
         dicta.pop(key1) 

    listop = dicta.keys() 
    print listop 
    return listop 

我得到错误:

File "main.py", line 14, in uniqueValues if aDict[key] == aDict[key1]: KeyError: 1

我哪里做错了吗?

+2

要修改你的字典('dicta.pop(键)'),同时通过它迭代导致意想不到的结果。 – Delgan

回答

1

你的主要问题是这一行:

dicta = aDict 

你认为你正在做的词典的一个副本,但实际上你还是只有一个字典,所以在判词操作也改变aDict(等等,你从adict中删除值,它们也会从aDict中移除,所以你会得到你的KeyError)。

一个解决办法是

dicta = aDict.copy() 

(你也应该给你的变量更清晰的名字,使之更加明显自己,你在做什么)

(编辑)。另外,一个更简单的方式做你正在做什么:

def iter_unique_keys(d): 
    values = list(d.values()) 
    for key, value in d.iteritems(): 
     if values.count(value) == 1: 
      yield key 

print list(iter_unique_keys({1: 1, 2: 1, 3: 3})) 
0

使用Countercollections库:

from collections import Counter 

ip = { 
    1: 1, 
    2: 1, 
    3: 3, 
    4: 5, 
    5: 1, 
    6: 1, 
    7: 9 
} 

# Generate a dict with the amount of occurrences of each value in 'ip' dict 
count = Counter([x for x in ip.values()]) 

# For each item (key,value) in ip dict, we check if the amount of occurrences of its value. 
# We add it to the 'results' list only if the amount of occurrences equals to 1. 
results = [x for x,y in ip.items() if count[y] == 1] 

# Finally, print the results list 
print results 

输出:

[3, 4, 7] 
+2

这是执行OP所要做的事情的好方法,但这实际上并不能帮助他理解代码失败的原因。 – Delgan

+0

@Delgan,我不会修复他的代码。教育人们比向他们展示解决方法更好。如果他得到一个解决他的问题的答案,其他人会从这个答案中受益吗?你想帮助他还是整个社区?想想超越这个盒子,这是一个社区。 –

+1

如果你不帮助他理解代码有什么问题,即'dicta = aDict'没有执行真正的副本,那么他将在未来犯同样的错误,并再次提出同样的问题。这不仅仅是展示解决方法,这是解释和教育。这也有助于其他不知道这个问题的人。提供一种替代和最优雅的方式来执行他正在尝试做的事情是非常好的,但这不应该是你答案中孤独的部分,而应该写出来。 – Delgan