通过匹配 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]
其中 X1
和 X2
包含相同的值但顺序不同。如何将 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]
我有一个(可能很简单的)问题我无法在 Python 中解决。
假设我有一个列表
X1 = [1,2,3]
与相应的列表
Y1 = [5,6,7]
和一个清单
X2 = [2,1,3]
有相应的列表
Y2 = [8,9,10]
其中 X1
和 X2
包含相同的值但顺序不同。如何将 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]