按值对字典进行排序[重复]
Posted
技术标签:
【中文标题】按值对字典进行排序[重复]【英文标题】:Sort a Dict by values [duplicate] 【发布时间】:2022-01-19 18:43:30 【问题描述】:我有一个问题:在 Python 中
我有一个给定的字典
W = 'Cat': 2, 'Mice': 2, 'Dog': 5, 'Duck': 2, 'Hamster': 5
现在我想对其进行排序,新的 Dict 看起来像这样:
new_Dict = 2 : ['Cat','Mice', 'Duck'], 5 : ['Dog','Hamster']
我已经在互联网上找到了一些解决方案,但是我对编程很陌生,所以我不太了解它们。所以因为我们在学校有“for ... in range()”、“while...”和“def()”(以及绝对基本的东西^^)
【问题讨论】:
“我已经在互联网上找到了一些解决方案....所以我不太了解它们”。将您发现和尝试过的内容以及您不了解的内容包括在内会很有帮助 好吧,正如您已经提到的,一种方法是使用 for 循环,并在检查是否已添加任何键值时将值添加到新的 Dict 中,因此您可以将值添加到现有键中,如果不存在则创建一个新键 您好,新帐户。您可以将您的问题直接粘贴到页面顶部的 *** 搜索栏中,并从已经提出问题的人那里获得大量出色的结果 查看defaultdict(…)
。
“我要排序”是什么意思?它不是“排序”而是一种聚合?
【参考方案1】:
使用for
循环的简单解决方案:
W = 'Cat': 2, 'Mice': 2, 'Dog': 5, 'Duck': 2, 'Hamster': 5
new_dict = dict()
for k,v in W.items():
if v in new_dict:
new_dict[v].append(k)
else:
new_dict[v] = [k]
【讨论】:
【参考方案2】:一个简短的说明 - 您所描述的不是“排序”!排序是你有一个像[2, 1, 6, 3]
这样的列表,然后你把它变成[1, 2, 3, 6]
——你所做的更像是颠倒字典的键和值;您正在获取值并将它们用作键,并将键列表用作值。
就像您可以使用for ... in range(...)
来遍历range
,您可以使用for ... in W
来遍历W
中的所有键:
new_Dict = # empty dict
for key in W:
val = W[key]
if val not in new_Dict:
new_Dict[val] = [] # empty list
new_Dict[val].append(key)
还有其他迭代字典的方法可以使这更容易。例如,每个字典都有一个 items()
方法,它会自动为您提供值和键:
new_Dict = # empty dict
for key, val in W.items():
if val not in new_Dict:
new_Dict[val] = [] # empty list
new_Dict[val].append(key)
还有一个非常有用的东西,叫做collections.defaultdict
,它是一个字典,可以自动创建一个不存在的值,无论你想要什么类型。在这种情况下,我们希望new_Dict
中的每个值都以空的list
开头,因此与其不断检查该值是否存在并在不存在时创建一个新列表,我们可以创建一个defaultdict
使用 list
作为默认值:
from collections import defaultdict
new_Dict = defaultdict(list)
for key, val in W.items():
new_Dict[val].append(key)
奖励预览:了解列表推导和字典推导后,您可以在一行中构建这样的字典!
new_Dict = val: [k for k, v in W.items() if v == val] for val in set(W.values())
【讨论】:
为什么是set
而不仅仅是val: [k for k, v in W.items() if v == val] for val in W.values()
?
你永远不应该使用那种 dict 理解,面对首先展示的其他更好的实现,它的效率非常低。
@hpchavaz 它可以提高效率,但在最坏的情况下仍然是 O(N^2)。基本上【参考方案3】:
创建一个新字典
sorted_W =
遍历键值对。
for key, value in W.items():
如果排序字典中不存在值(动物的值),则创建一个空列表(一个列表,因为多个动物可以有相同的出现)。
if value not in sorted_W:
sorted_W[value] = []
将键(动物名称)附加到列表中。
sorted_W[value].append(key)
完整代码:
W = 'Cat': 2, 'Mice': 2, 'Dog': 5, 'Duck': 2, 'Hamster': 5
sorted_W =
for key, value in W.items():
if value not in sorted_W:
sorted_W[value] = []
sorted_W[value].append(key)
print(sorted_W)
【讨论】:
以上是关于按值对字典进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
node.js - 按值对 JSON 对象进行排序 [重复]