通过匹配 Python 中的 'input' 列表对列表进行排序

Sorting of list by matching the 'input' lists in Python

我有一个(可能很简单的)问题我无法在 Python 中解决。

假设我有一个列表 X1 = [1,2,3] 与相应的列表 Y1 = [5,6,7] 和一个清单 X2 = [2,1,3] 有相应的列表 Y2 = [8,9,10] 其中 X1X2 包含相同的值但顺序不同。如何将 X2 的顺序与 X1 的顺序匹配,同时 X2 Y2 对保持不变?那么答案应该是Y2 = [9,8,10]

提前致谢!

你可以这样做:

[Y2[X1.index(x)] for x in X2]

这有一个O(n^2)的时间复杂度,如果你之前用X1的索引建立一个字典,你可以得到O(n)的时间复杂度:

d = {x: i for i, x in enumerate(X1)}
[Y2[d[x]] for x in X2]

你可以玩 zip

您的代码:

x1 = [1, 2, 3]
y1 = [5, 6, 7]

x2 = [2, 1, 3]
y2 = [8, 9, 10]

第 1 步压缩列表:

z1 = list(zip(x1, y1))    
z2 = list(zip(x2, y2))

输出:

[(1, 5), (2, 6), (3, 7)]
[(2, 8), (1, 9), (3, 10)]

第 2 步对新列表进行排序:

z1.sort()
z2.sort()

输出:

[(1, 5), (2, 6), (3, 7)]
[(1, 9), (2, 8), (3, 10)]

第 3 步用 *

再次列出压缩它们
z1 = list(zip(*z1))
z2 = list(zip(*z2))

输出:

[(1, 2, 3), (5, 6, 7)]
[(1, 2, 3), (9, 8, 10)]

现在把值放回去:

x1 = z1[0]
y1 = z1[1]
x2 = z2[0]
y2 = z2[1]

输出:

x1 = (1, 2, 3)
y1 = (5, 6, 7)
x2 = (1, 2, 3)
y2 = (9, 8, 10)

记住 x1, x2, y1, y2 现在是元组,如果你想成为列表,你还需要一步

x1 = list(x1)
x2 = list(x2)
y1 = list(y1)
y2 = list(y2)

输出:

x1 = [1, 2, 3]
y1 = [5, 6, 7]
x2 = [1, 2, 3]
y2 = [9, 8, 10]
n = len(X1)
inds = range(n)
d = {X2[i_]:Y2[i_] for i_ in inds}   
nY2 = [d[X1[i_]] for i_ in inds]