本质上,我想删除字典中每个值不等于最大值的键。
假设这是字典:
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,所以如果我犯了一些愚蠢的错误,我很抱歉。
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())
从Dict
到delete
的键永远不要改变你正在迭代的迭代器,它会给你RuntimeError
。因此,将其复制到另一个变量中,并按照Anand S Kumar
的建议更改前一个变量
你不应该改变你正在迭代的对象,这通常会产生意想不到的结果(内部指针被移动,你在迭代中错过了元素等等)。您最好收集要删除的键,然后在单独的迭代中删除键:
keys = [k for k in myDict.keys() if myDict[k] == max(myDict.values())];
for k in keys: del myDict[k];
最好将max
表达式也放在变量中,这样它就不会被多次求值。不确定Python是否能够为您优化(可能不会)。
您可以使用字典推导来创建一个新字典:
newDict = {k: v for k,v in myDict.items() if v == max(myDict.values())}
newDict
输出:
{'Steve': 5, 'Bill': 5}