【问题标题】: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 中,因此您可以将值添加到现有键中,如果不存在则创建一个新键
  • 您好,新帐户。您可以将您的问题直接粘贴到页面顶部的 StackOverflow 搜索栏中,并从已经提出问题的人那里获得大量出色的结果
  • 查看defaultdict(…)
  • “我要排序”是什么意思?它不是“排序”而是一种聚合?

标签: python function dictionary while-loop


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多