按值对字典进行排序[重复]

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)

【讨论】:

以上是关于按值对字典进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按值对HashMap进行排序[重复]

按值对 JSON 进行排序 [重复]

node.js - 按值对 JSON 对象进行排序 [重复]

如何按值对数组进行排序(排序)? *有一个转折*

在Python中按值对嵌套字典进行排序,并按另一个值对余数进行排序

在Java中按键或值对地图进行排序[重复]