我的代码中的 keyerror 1
Posted
技术标签:
【中文标题】我的代码中的 keyerror 1【英文标题】:keyerror 1 in my code 【发布时间】:2016-02-21 08:47:08 【问题描述】:我正在编写一个函数,该函数接受字典输入并返回在该字典中具有唯一值的键列表。考虑一下,
ip = 1: 1, 2: 1, 3: 3
所以输出应该是 [3] 因为键 3 具有唯一值,该值在 dict 中不存在。
现在给定的功能有问题:
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
我收到如下错误:
文件“main.py”,第 14 行,位于 uniqueValues 中 如果 aDict[key] == aDict[key1]: KeyError: 1
我哪里做错了?
【问题讨论】:
您正在修改您的字典 (dicta.pop(key)
),同时迭代它会导致意外结果。
【参考方案1】:
你的主要问题是这一行:
dicta = aDict
您认为您正在制作字典的副本,但实际上您仍然只有一个字典,因此对 dicta 的操作也会更改 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))
【讨论】:
【参考方案2】:使用collections
库中的Counter
:
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]
【讨论】:
这是执行 OP 试图做的事情的好方法,但这实际上并不能帮助他理解其代码失败的原因。 @Delgan,我不会修复他的代码。教育人们比仅仅向他们展示解决方法要好。如果他得到解决问题的答案,其他人会从该答案中受益吗?你想帮助他还是整个社区?跳出框框思考,这是一个社区。span> 如果你不帮助他理解代码有什么问题,即dicta = aDict
不是在执行真正的复制,那么他以后会犯同样的错误,问同样的问题再次。这不仅仅是展示解决方法,而是解释和教育。这也有助于其他不了解此问题的人。提供一种替代和最优雅的方式来执行他正在尝试做的事情非常好,但这不应该是你答案的孤独部分,应该另外写。
为什么我要发布一个额外的答案,而 Emile 的一个完美地解释了这个问题并提供了另一种工作方式?...以上是关于我的代码中的 keyerror 1的主要内容,如果未能解决你的问题,请参考以下文章
KeyError:“[['','']] 中没有一个在 [columns] 中”pandas python
在 Pandas 中使用 groupby 函数时如何解决“keyerror”?