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

2024-10-04 03:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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个最大值相同的变量呢?你知道吗


Tags: 代码用户内容字典printdestiny2crashbandicootsouthpark
3条回答

让我给你介绍一个更复杂但更有力的答案。如果对字典项进行排序,可以使用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行获取字典项的键/值对,并根据值对它们进行排序。我在前面放了一个-,这样这些值就可以按降序排序了。该行的结果是:

>>> print(sorted_kvp)

[('tres', 3), ('troi', 3), ('three', 3), ('two', 2), ('dos', 2), ('one', 1)]

注意,如上所述,键的顺序(在本例中是“tres”、“troi”和“three”,然后是“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异常)。你知道吗

给我一本字典

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)]

你可以这样做:

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)

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

相关问题 更多 >