我有一个物品清单:
[9, 8, 10, 2]
Run Code Online (Sandbox Code Playgroud)
我想排序
这些项目的相应值列表 2 是:[10, 11, 8, 5]
如何对 list1: [2 8 9 10] 进行排序并与另一个列表保持相同的关系,以便另一个列表重新排序 [5, 11, 10, 8]
这里有一个类似的问题:Python 从另一个列表中对一个列表进行排序, 但这是给我们排序的时候。
一个选择是zip将两个列表放在一起,按压缩列表的每个元组中的第一项对它们进行排序,然后从该排序列表中获取第二项。
from operator import itemgetter
fst = itemgetter(0)
snd = itemgetter(1)
[snd(tup) for tup in sorted(zip(list1, list2), key=fst)]
>> [5, 11, 10, 8]
Run Code Online (Sandbox Code Playgroud)
如果您需要两个列表作为输出,那么这个答案就以与这个相同的简洁方式完成。
你可以用这个:
list1, list2 = zip(*sorted(zip(list1, list2)))
Run Code Online (Sandbox Code Playgroud)
或这个:
order = sorted(range(len(list1)), key=lambda i: list1[i])
list1 = [list1[i] for i in order]
list2 = [list2[i] for i in order]
Run Code Online (Sandbox Code Playgroud)
第一个创建一个具有匹配对的新列表 fromlist1和list2,然后对这些对进行排序,这将主要关注来自 的值list1,并将该list2值用作决胜局。然后zip(*new_list)是一个标准的 Python 技巧,用于将这些对拆分回单独的列表。它将所有对组合在一起,形成一个包含两个长行的新列表,一个是每对中的第一个项目,一个是第二个项目。然后将该列表分配给两个变量会将其拆分为两个列表。
第二个为两个列表中的项目创建索引,然后使用相应的项目list1作为键对索引进行排序。然后它使用新的排序从每个列表中检索项目。
或者这种混合可能更具可读性:
sorted_pairs = sorted(zip(list1, list2))
list1 = [v1 for v1, v2 in sorted_pairs]
list2 = [v2 for v1, v2 in sorted_pairs]
Run Code Online (Sandbox Code Playgroud)