【问题标题】:Order a dictionary's elements using lambda使用 lambda 对字典的元素进行排序
【发布时间】:2018-12-22 11:41:39
【问题描述】:

我正在尝试对字典中的值进行排序。每个值都是(element, [element,element...]) 形式的元组。

如果它看起来像这样:

{'5': (2, ['6']), '1': (3, ['4', '3']), '7': (3, ['9', '11', '12'])}

应该是这样的:

{'5': (2, ['6']), '1': (3, ['3', '4']), '7': (3, ['11', '12', '9'])}

如你所见,顺序是字典字符串顺序。

我尝试使用 lambda 进行排序,但无法进入列表:

sortedDict = sorted(orderDict.values(),key=lambda x:x[0])

【问题讨论】:

    标签: python python-3.x sorting dictionary


    【解决方案1】:

    你快到了,你想做的是在值的第二个元素上使用sortedkey=str(如果你不确定你的元素是否总是str 类型)。

    您也不需要为此使用lambda-表达式。

    这可以简单地使用dict comprehension

    d = {'5': (2, ['6']), '1': (3, ['4', '3']), '7': (3, ['9', '11', '12'])}
    
    sorted_d = {k: (v0, sorted(v1, key=str)) for k, (v0, v1) in d.items()}
    

    如果您想就地执行此操作,那么推荐使用 answer of @ZeroPiraeus。由于sort 是就地操作,原则上您可以将其打包到列表理解中。 但请注意,这不推荐,因为您会生成一个您不使用的列表

    In [38]: [v1.sort(key=str) for _, v1 in d.values()]                            
    Out[38]: [None, None, None]
    

    【讨论】:

    • 非常感谢,如果是时间复杂度的问题,用lambda有区别吗?
    • @LordNord 对此没有直接的答案。在某些情况下,生成器更快,有时是lambda-expressoins。这是 python 社区中的一个敏感话题,所以我只会指出一些讨论:stackoverflow.com/questions/3013449/…stackoverflow.com/questions/1247486/list-comprehension-vs-map
    • 如果您不需要生成的列表,请不要使用列表推导。这不是惯用的 Python。请改用for 循环。
    • @timgeb 你是对的,我应该更清楚地说明 for 循环是推荐的方式。改编了答案。
    • @jojo 谢谢你,我正在使用零比雷埃夫斯,对我来说它看起来更具可读性,无论如何非常感谢你帮助我,我学到了一些新东西。
    【解决方案2】:

    如果您想返回orderDict 的排序副本,@jojo 的答案将起作用。要对字典进行排序而不需要复制,只需遍历其值并对其进行排序:

    for v in orderDict.values():
        v[1].sort()
    

    请注意,您不需要指定key,因为您的列表已经由字符串组成,这些字符串将按照您的预期进行排序。如果您的列表确实包含整数,您将添加key=str

    for v in orderDict.values():
        v[1].sort(key=str)
    

    【讨论】:

    • 感谢您的评论。如果 str 旁边都是整数,事情就在这里。它也有用吗?
    • @LordNord 我添加了一条注释……
    【解决方案3】:

    另一种解决方案是使用dict.setdefault(),如下:

    my_d = {'5': (2, ['6']), '1': (3, ['4', '3']), '7': (3, ['9', '11', '12'])}
    new_d ={}
    for n in my_d.keys():
        new_d.setdefault(n, (my_d[n][0], sorted(my_d[n][1])))
    
    print new_d
    

    输出:

    {'1': (3, ['3', '4']), '5': (2, ['6']), '7': (3, ['11', '12', '9'])}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多