【问题标题】:How do I sort a list which is a value of dictionaries?如何对作为字典值的列表进行排序?
【发布时间】:2019-03-23 05:13:03
【问题描述】:

我需要使用计算成本较低的函数对作为字典值的列表进行排序。我无法分享原始代码,所以请帮助我提供以下示例。

我尝试使用标准方法,解析值,使用中间列表进行排序并将其存储在计算密集型的新字典中。我正在尝试简化它,为此,我期待任何建议或方法来合并。

输入

a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]}

输出

a= {'a':1, 'b': [2,3,4,8], 'c':['a','c',5,6,7]}

【问题讨论】:

  • 你已经尝试了什么?
  • 我尝试使用标准方法,解析值,使用中间列表进行排序并将其存储在计算密集型的新字典中。我正在努力简化它,为此,我期待任何建议或方法来整合。
  • @PatrickArtner,实际上列表包含字符串和数字,a 和 c 代表字符串...我编辑了它,谢谢指出。

标签: python python-3.x alibaba-cloud alibaba-cloud-ecs


【解决方案1】:

一般情况下(如果您的值是可比较项的列表,例如仅数字),您可以这样做

sorted_dict = {key: sorted(value) for key, value in original_dict.items()}

如果您的值是单个数字/字符串,则应将 sorted(value) 更改为 sorted(value) if isinstance(value, list) else value。 (感谢用户@DeepSpace指出)。

但是,您提供的示例无效,除非 ac 引用整数值。

【讨论】:

  • if isinstance(value, list) else value
【解决方案2】:

您不需要对字典进行排序,您需要对字典内的所有列表值进行排序。您根本不需要创建任何新对象:

a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings

for e in a:
    if isinstance(a[e],list):
        a[e].sort()         # inplace sort the lists

print(a)

输出:

{'a': 1, 'c': [5, 6, 7, 'a', 'c'], 'b': [2, 3, 4, 8]}

这不会创建新的字典,也不会创建新的列表 - 它只是对列表进行就地排序。除非您对列表有特殊的领域知识,否则您无法获得更快/更少的计算,这将使编程一个专门的就地排序器来替代 list.sort() 可行。


在 Python 3 上(感谢@Matthias Profil)int ansd str 之间的比较给出 TypeError - 您可以通过一些可选计算“修复”它(灵感来自于:python-list-sort-query-when-list-contains-different-element-types 的答案):

def IsString(item):    
    return isinstance(item,str)
def IsInt(item):
    return isinstance(item,int)

a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings

for e in a:
    if isinstance(a[e],list):
        try:
            a[e].sort()         # inplace sort the lists
        except TypeError:
            str_list = sorted(filter(IsString,a[e]))
            int_list = sorted(filter(IsInt,a[e]))
            a[e] = int_list + str_list # default to numbers before strings

print(a)

【讨论】:

  • 如果混合使用整数和字符串,您将收到以下错误:TypeError: '<' not supported between instances of 'int' and 'str'。在 Python 2 上它可能会工作。
  • @Matthias 你是对的 - 似乎我将 pyfiddle.org 设置为 2.7 - 我的错。除非接受被删除,否则我无法删除答案。我知道如果我找到解决方法。
  • 这个 Q python-list-sort-query-when-list-contains-different-element-types 给出了一些关于如何修复它的提示 - 不幸的是,要么创建新列表(分成数据类型,独立排序,然后加入或从所有创建字符串并按此排序)或需要perdefeinerd lt 运算符,如果可能,必须将其修补到 int/string 中:/
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多