【问题标题】:Sort list of values in a dictionary对字典中的值列表进行排序
【发布时间】:2022-01-18 13:47:30
【问题描述】:

假设我有以下字典:

diction = {"string": ["alabama", "fruit", "emoji"], "number": [9, 13, 20]}

如何获得一个字典,其中“数字”键的值按降序排序,“字符串”应该按照数字键排序?字符串和数字键是关联的

我想得到

diction = {"string": ["emoji", "fruit", "alabama"], "number": [20, 13, 9]}

非常感谢。

【问题讨论】:

  • sorted 怎么不起作用?请提供您尝试解决问题的代码
  • 为什么没有像 [{"string":"Alabama","number":9}, ... ] 这样的 dicts 列表,有两个序列相互依赖的列表听起来像它们本身应该是一个键/值对

标签: python dictionary


【解决方案1】:

使用由diction['number']选择的另一个列表排序:

diction["string"] = [x for _,x in sorted(zip(diction['number'], 
                                             diction['string']),
                                         key=lambda pair: pair[0], 
                                         reverse=True)]
diction["number"] = sorted(diction["number"], reverse=True)
print (diction)

{'string': ['emoji', 'fruit', 'alabama'], 'number': [20, 13, 9]}

或使用pandas:

import pandas as pd

d = pd.DataFrame(diction).sort_values('number', ascending=False).to_dict(orient='list')
print (d)
{'string': ['emoji', 'fruit', 'alabama'], 'number': [20, 13, 9]}

【讨论】:

    【解决方案2】:

    这是一种获得所需输出的方法。

    from collections import defaultdict
    
    diction = {"string": ["alabama", "fruit", "emoji"], "number": [9, 13, 20]}
    
    d = defaultdict(list)
    for strng, num in zip(diction["string"], diction["number"]):
        d[strng].append(num)
    
    d = dict(sorted(d.items(), key=lambda x: x[1], reverse=True))
    
    diction = {"string": [k for k in d.keys()], "number": [j[0] for j in d.values()]}
    
    print(diction)
    

    输出:

    {'string': ['emoji', 'fruit', 'alabama'], 'number': [20, 13, 9]}
    

    我同意JeffUKcomment 关于使用键/值对。您可以使用上述 sn-p 执行此操作,但在打印之前删除重建 diction 的行

    【讨论】:

      【解决方案3】:

      sorted 可以正常工作。

      diction["number"] = sorted(diction["number"])
      

      【讨论】:

      • 这仅对数字键进行排序,而不是对整个字典进行排序
      • 这就是你的问题所要求的。
      • 请再次检查预期输出并再次查看“字符串”键
      • 您可能需要编辑您的问题以明确您的实际要求。您要求对 numbers 键进行排序。这样做就可以了。
      • 我认为他们想对“数字”列表进行排序,但也以相同的方式对“字符串”列表进行排序(即假设它们是链接的,并按元素的当前位置排序) '数字')
      【解决方案4】:

      对于将根据排序其中一个的重新排序对字典中所有列表进行排序的通用方法,您可以按新排序顺序构建索引列表并将其应用于所有列表:

      diction = {"string": ["alabama", "fruit", "emoji"], "number": [9, 13, 20]}
      
      keys  = diction["number"]                      # list to sort
      order = sorted(range(len(keys)),key=lambda i:keys[i],reverse=True) # indexes
      for lst in diction.values():
          lst[:] = [lst[i] for i in order]           # apply new order to all lists
      
      print(diction)
      {'string': ['emoji', 'fruit', 'alabama'], 'number': [20, 13, 9]}
      

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 1970-01-01
        • 2014-02-14
        相关资源
        最近更新 更多