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')] |
然后剩下的就是把这些列表打开。
您可以使用
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 |
。
请注意,我不认为有任何保证可以按顺序调用每个列表项的