使用排序另一个列表的结果在Python中对列表进行排序

Sorting a list in Python using the result from sorting another list

本问题已经有最佳答案,请猛点这里访问。

我有两张用python写的单子

1
2
list_1 = [5, 2, 8];
list_2 = ['string1', 'string2', 'string3']

我想对第一个列表进行排序,并使用结果对第二个列表进行排序。

换句话说,结果应该是:

1
2
3
# Sorted in descending order
list_1_sorted = [8, 5, 2];
list_2_sorted = ['string3', 'string1', 'string2'];

我知道如何分别对这些列表进行排序,但如何使用排序其他列表所产生的索引排列来排列一个列表?


施瓦兹变换

1
2
list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2),
  key=operator.itemgetter(0), reverse=True))


将列表压缩在一起,排序,解压列表:

1
2
3
4
5
together = zip(list_1, list_2)
sorted_together =  sorted(together)

list_1_sorted = [x[0] for x in sorted_together]
list_2_sorted = [x[1] for x in sorted_together]

这里所发生的是,zip创建了一个元组列表,其中的元素希望列表按第一个元素排序:

1
2
3
4
>>> a = [1,3,7,3,2]
>>> b = ["one","two",'three','four','five']
>>> zip(a,b)
[(1, 'one'), (3, 'two'), (7, 'three'), (3, 'four'), (2, 'five')]

然后排序时,元素保持成对:

1
2
>>> sorted(zip(a,b))
[(1, 'one'), (2, 'five'), (3, 'four'), (3, 'two'), (7, 'three')]

然后剩下的就是把这些列表打开。


您可以使用zip

1
2
3
4
5
6
7
8
9
10
>>> list_1 = ['string1', 'string2', 'string3']
>>> list_2 = [5, 2, 8]
>>> s = sorted(zip(list_2, list_1), reverse=True)
>>> list_1_sorted = [e[1] for e in s]
>>> list_2_sorted = [e[0] for e in s]
>>> list_1_sorted
['string3', 'string1', 'string2']
>>> list_2_sorted
[8, 5, 2]
>>>


@伊格纳西奥的回答是最好的,但是如果你需要在不创建新列表的情况下对列表进行排序,你可以尝试以下方法:

1
2
3
4
5
6
7
import itertools
list_enumerate = itertools.count()

list_2.sort(reverse=True, key=lambda k: list_1[next(list_enumerate)])
list_1.sort(reverse=True)
print list_1
print list_2

请注意,我不认为有任何保证可以按顺序调用每个列表项的key函数(这是工作所必需的),因此这是一种风险很大的方法。