如何对列表进行排序,该列表是词典的值?

时间:2018-10-18 11:45:58

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

我需要使用一个计算成本较低的函数对一个列表进行排序,该列表是词典的值。我将无法共享原始代码,因此请通过以下示例为我提供帮助。

我尝试了标准方法,解析了值,使用中间列表进行排序并将其存储在新的字典中,该字典需要大量计算。我正在尝试简化它,为此,我希望能提出任何建议或方法。

输入

  

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]}

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:0)

通常(如果您的值是可比较的项的列表,例如仅数字),则可以执行以下操作

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

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

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