Python:根据一个列表的索引对字典列表进行排序

时间:2016-10-14 23:32:35

标签: python list dictionary

所以我有下列词:

dict1 = {1: [-1, 1, 2, 4, 3], 2: [11, 10, 9, 8, 7]}

如何根据对其中一个列表进行排序的索引对dict1中的列表进行排序。例如列表的排序索引

[11, 10, 9, 8, 7]

[4, 3, 2, 1, 0]

所以新的dict1将是:

dict1 = {1: [3, 4, 2, 1, -1], 2: [7, 8, 9, 10, 11]}

我尝试过这样的代码:

sorted(dict1.items(), key=lambda t: t[1])

但仍然无法弄明白?我可以使用for循环来完成这项工作,但我相信存在更多的pythonic方式。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

一种方法是计算索引列表并将其应用于所有列表:

>>> dict1 = {1: [-1, 1, 2, 4, 3], 2: [11, 10, 9, 8, 7]}
>>> basis = dict1[2]
>>> indexes = sorted(range(len(basis)), key=basis.__getitem__)
>>> for lst in dict1.values():
        lst[:] = [lst[i] for i in indexes]

>>> dict1
{1: [3, 4, 2, 1, -1], 2: [7, 8, 9, 10, 11]}

如果您对确定订单的“第一个”列表没有问题(您只根据[...]其中一个列表表示),您还可以构建列并排序那些:

>>> dict1 = {1: [-1, 1, 2, 4, 3], 2: [11, 10, 9, 8, 7]}
>>> dict(zip(dict1.keys(), zip(*sorted(zip(*dict1.values())))))
{1: (-1, 1, 2, 3, 4), 2: (11, 10, 9, 7, 8)}

答案 1 :(得分:1)

使用enumerate进行排序以获取已排序的索引,并使用索引对其他列表进行排序:

from operator import itemgetter
dict1 = {1: [-1, 1, 2, 4, 3], 2: [11, 10, 9, 8, 7]}

l = [i for i, _ in sorted(enumerate(dict1[2]), key=itemgetter(1))]


for v in dict1.values():
    v[:] = (v[i] for i in l)
print(dict1)

或者如果你想要一个新的词典:

l = [i for i, _ in sorted(enumerate(dict1[2]), key=itemgetter(1))]
new = {k: [v[i] for i in l] for k, v in dict1.items()}

或者如果你不介意元组:

new = {k: itemgetter(*l)(v) for k, v in dict1.items()})

答案 2 :(得分:0)

itemgetter

中使用dictionary comprehension
>>> from operator import itemgetter
>>> order = [4, 3, 2, 1, 0]
>>> key = itemgetter(*order)
>>> {k: key(dict1[k]) for k in dict1}
{1: (3, 4, 2, 1, -1), 2: (7, 8, 9, 10, 11)}