如何通过元组中的名称对字典中的元组进行排序

时间:2016-04-07 02:08:09

标签: python sorting dictionary

dict_d = {'Blue': [('Camaro', 10, 12)], 'Red': [('Camara', 10, 5)], 'Green': [('Nancy', 10, 8), ('Steve', 7, 8), ('Rich', 10, 4)]}

我上面有一个字典,我只想对具有多个值的字典进行排序,在这种情况下为“绿色”。我想按名字排序。基本上,我想得到的是:

{'Blue': [('Camaro', 10, 12)], 'Red': [('Camara', 10, 5)], 'Green': [('Nancy', 10, 8), ('Rich', 10, 4), ('Steve', 7, 8)]}

不同之处在于Green中的元组已按名称排序。

以下是我的尝试:

sorted((dict_d).items(), key = (lambda x: list(x)[1][0]))

它没有给我任何错误,它没有排序..... 很困惑......

2 个答案:

答案 0 :(得分:1)

您不是要对字典进行排序,而是对字典的值进行排序,您可以使用字典理解来重构具有排序值的字典。

当您尝试按名称排序时,只需将名称[0]编入索引作为排序键。

>>> {k: sorted(v, key=lambda x: x[0]) for k, v in dict_d.items()}
{'Blue': [('Camaro', 10, 12)],
 'Green': [('Nancy', 10, 8), ('Rich', 10, 4), ('Steve', 7, 8)],
 'Red': [('Camara', 10, 5)]}

注意:如果您不关心基于值的订单,那么您可以忽略该密钥并对元组进行排序 - sorted(v)

答案 1 :(得分:1)

如果你仔细阅读,你的问题就有答案:

  1. 遍历词典中的项目
  2. 如果值(在本例中为列表)的长度为> 1
    • 对值进行排序
  3. 注意:对列表进行排序时,Python的自然排序方法是遍历每个项目。 Python通过排序评估元组中的每个项目来排序元组(在列表中)。所以它比较了每个元组中的第一项,然后是第二项,然后是第三项。所以'名字'在这些元组中进行自动比较而无需任何特殊的比较功能。

    >>> d = {'Blue': [('Camaro', 10, 12)], 'Red': [('Camara', 10, 5)], 'Green': [('Nancy', 10, 8), ('Steve', 7, 8), ('Rich', 10, 4)]}
    >>> for k, v in d.items():
    ...     if len(v) > 1:
    ...         d[k] = sorted(v)
    ...
    >>> d
    {'Blue': [('Camaro', 10, 12)], 'Green': [('Nancy', 10, 8), ('Rich', 10, 4), ('Steve', 7, 8)], 'Red': [('Camara', 10, 5)]}
    

    当您的列表只有一个元组时,if len(v) > 1步骤实际上并不需要完成。由于列表只有一个项目,因此Python无需排序。

    根据您的尝试进行修改:sorted((dict_d).items(), key = (lambda x: list(x)[1][0])):按照下面的AChampion's answer构建一个由排序值组成的新词典。