按每个列表中的第二个元素对列表字典进行排序

时间:2018-10-23 09:58:15

标签: python sorting dictionary

我有一个列表字典,例如:

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

,我想按每个子列表中的第二个元素对每个值列表进行排序(升序)。所需的输出字典为:

output_dict = { 'a' : [[54, 1, 34], [2, 5, 9], [1, 6, 8]],
                'b' : [[2, 1, 9], [54, 2, 34], [1, 3, 8]],
                'c' : [[1, 1, 8], [54, 7, 34], [2, 9, 9]]
              }

我正在尝试:

sorted_dict = dict(sorted(test_dict.items(), key=lambda e: e[1][1]))
sorted_dict.items()

这似乎没有任何作用。

2 个答案:

答案 0 :(得分:2)

您要按字典值对列表列表进行排序,而不是按字典键顺序。为此,您可以使用字典理解:

res = {k: sorted(v, key=lambda x: x[1]) for k, v in test_dict.items()}

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

对于等效功能,可以使用key=operator.itemgetter(1)。在Python 3.6+中,应保持字典顺序。在3.6版之前,字典是无序的,您不应该期望键的任何特定顺序。

要按键订购,可以使用collections.OrderedDict

from collections import OrderedDict

res_ordered = OrderedDict(sorted(res.items(), key=lambda x: x[0]))

OrderedDict([('a', [[54, 1, 34], [2, 5, 9], [1, 6, 8]]),
             ('b', [[2, 1, 9], [54, 2, 34], [1, 3, 8]]),
             ('c', [[1, 1, 8], [54, 7, 34], [2, 9, 9]])])

答案 1 :(得分:2)

您可以按照以下步骤操作,它将更新现有字典

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

for k, v in test_dict.items():
    test_dict[k] = sorted(v, key=lambda e: e[1])

print(test_dict)

创建新词典

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

new_dict = {k:sorted(v, key=lambda e: e[1]) for k, v in test_dict.items()}

print(new_dict)