删除字典中的项目,其值不等于Python中的最高值

时间:2015-09-05 13:26:14

标签: python sorting dictionary

基本上我想删除字典中的每个键,如果它的值不等于最高值。

让我们说这是字典:

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,所以如果我犯了任何愚蠢的错误,我很抱歉。

3 个答案:

答案 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}