基本上我想删除字典中的每个键,如果它的值不等于最高值。
让我们说这是字典:
myDict = {"Bob": 1, "Bill": 5, "Barry": 4, "Steve": 5}
我可以使用它来按值对其进行排序:
myDict = sorted(myDict, key=myDict.get, reverse=True)
现在我想删除字典中不等于最高值的任何键(在本例中为'5')。最终得到这个:
myDict = {"Bill": 5, "Steve": 5}
我尝试过使用这个for循环:
for item, v in myDict:
if v < myDict[0]:
del myDict[v]
但是我收到了这个错误:
ValueError: too many values to unpack (expected 2)
这是a)我第一次在这里发帖,并且b)我只学了几个月的Python,所以如果我犯了任何愚蠢的错误,我很抱歉。
答案 0 :(得分:1)
for item, v in myDict
只是给你keys
mydict
,你正在item, v
中收集该密钥,原因是什么,
使用myDict.items()
或myDict.iteritems()
。
for item, v in myDict.iteritems():
if v < myDict[0]:
del myDict[v]
获得myDict
max(myDict.values())
来自delete
的{{1}}密钥永远不会更改您正在迭代的迭代器,它将为您提供Dict
。因此,请将其复制到另一个变量中,并将之前的变量更改为RuntimeError
建议。
答案 1 :(得分:0)
你永远不应该改变你正在迭代的对象,这通常会产生意想不到的结果(内部指针会被移位而你会错过迭代中的元素等等)。您最好收集要删除的密钥,然后在单独的迭代中删除密钥:
keys = [k for k in myDict.keys() if myDict[k] == max(myDict.values())];
for k in keys: del myDict[k];
最好将max
表达式放在一个变量中,这样它就不会被多次评估。不确定Python是否能够为您优化(可能不是)。
答案 2 :(得分:0)
您可以使用字典理解来创建新字典:
newDict = {k: v for k,v in myDict.items() if v == max(myDict.values())}
newDict
的输出:
{'Steve': 5, 'Bill': 5}