检查字典中的某些内容是否与该字典中的最大值相同?

时间:2017-06-08 15:32:50

标签: python dictionary max

如何检查字典中的某些内容是否与该字典中的最大值相同。换句话说,获取所有最大值而不是最低位置的最大值。 我有这个代码返回最大变量名称和值:

d = {'g_dirt4': g_dirt4, 'g_destiny2': g_destiny2, 'g_southpark': g_southpark, 'g_codww2': g_codww2, 'g_bfront2': g_bfront2, 'g_reddead2': g_reddead2, 'g_fifa18': g_fifa18, 'g_motogp17': g_motogp17, 'g_elderscrolls': g_elderscrolls, 'g_crashbandicoot': g_crashbandicoot} 
print("g_dirt4", g_dirt4, "g_destiny2", g_destiny2, "g_southpark", g_southpark, "g_codww2", g_codww2, "g_bfront2", g_bfront2, "g_reddead2", g_reddead2, "g_fifa18", g_fifa18, "g_motogp17", g_motogp17, "g_elderscrolls", g_elderscrolls, "g_crashbandicoot", g_crashbandicoot)
print (max(d.items(), key=lambda x: x[1]))

现在它打印具有最高值加上值本身的变量,但是如果有两个或三个具有相同最大值的变量怎么办?我想打印所有的最大值。

编辑:

用户必须填写一个表单,该表单将值添加到字典中的变量中。用户完成后,将有一个,两个或更多具有最高值的变量。例如,代码给了我这个:

2017-06-08 15:05:43 g_dirt4 9 g_destiny2 8 g_southpark 5 g_codww2 8 g_bfront2 8 g_reddead2 7 g_fifa18 8 g_motogp17 9 g_elderscrolls 5 g_crashbandicoot 6
2017-06-08 15:05:43 ('g_dirt4', 9)

现在它告诉我g_dirt4的最高值为9,但是如果你看motogp17,它也有9,但它没有被打印,因为它是在字典中的较高位置。那我怎么打印它们呢?如果它有3个具有相同最大值的变量怎么办?

3 个答案:

答案 0 :(得分:5)

给出一本字典

d = {'too': 2, 'one': 1, 'two': 2, 'won': 1, 'to': 2}

以下命令:

result = [(n,v) for n,v in d.items() if v == max(d.values())]

收益率:[('too', 2), ('two', 2), ('to', 2)]

答案 1 :(得分:4)

让我向您介绍一个更复杂但更强大的答案。如果您对字典项进行排序,可以使用itertools.groupby获得一些有力的结果:

import itertools
foo = {"one": 1, "two": 2, "three": 3, "tres": 3, "dos": 2, "troi": 3}
sorted_kvp = sorted(foo.items(), key=lambda kvp: -kvp[1])
grouped = itertools.groupby(sorted_kvp, key=lambda kvp: kvp[1])

sorted行获取字典项的键/值对,并根据值对它们进行排序。我在前面放了一个-,这样价值最终会按降序排序。该行的结果是:

  

>>>打印(sorted_kvp)

     

[(' tres',3),(' troi',3),(' three',3),(' two&# 39;,2),(' dos',2),(' one',1)]

请注意,正如上面提到的评论,键的顺序(在这种情况下,' tres',' troi'和'三'和那么' two' dos'是任意的,因为字典中键的顺序是任意的。

itertools.groupby行会从数据运行中生成组。 lambda告诉它查看每个键值对的kvp[1],即值。

目前,您只对最大值感兴趣,因此您可以这样做:

max, key_grouper = next(grouped)
print("{}: {}".format(max, list(key_grouper)))

并获得以下结果:

  

3:[(' tres',3),(' troi',3),(' three',3)]

但如果您希望所有信息都按照此方法进行排序,那就简单了:

for value, grouper in grouped: 
    print("{}: {}".format(value, list(grouper)))

产生

  

3:[(' tres',3),(' troi',3),(' three',3)]

     

2:[(' two',2),(' dos',2)]

     

1:[(' one',1)]

最后一个注意事项:您可以使用next或者您可以使用for循环,但使用两者会给您不同的结果。 grouped是一个迭代器,并在其上调用next将其移动到下一个结果(for循环使用整个迭代器,因此后续next(grouped)将导致StopIteration除外)。

答案 2 :(得分:1)

你可以这样做:

max_value = (max(d.items(), key=lambda x: x[1]))[1]
max_list = [max_value]

for key, value in d.items():
    if value == max_value:
        max_list.append((key, value))

print(max_list)

这将获得最大值,然后遍历字典中的所有键和值,并将匹配该最大值的所有值添加到列表中。然后打印列表,它应该打印所有列表。