我有两个清单:
X=[[1,2,3],[5,5],[1]]
Y=[[2,4],[1,4,6,6],[1,3]]
列表X和Y的元素之间存在一对一的关系。我想按项目的长度对X的元素进行排序,同时Y的项目按正确的位置排序。 X项目的新指数。
结果应为:
X=[[1],[5,5],[1,2,3]]
Y=[[1,3],[1,4,6,6],[2,4]]
答案 0 :(得分:6)
列表X和Y
的元素之间存在一对一的对应关系
这表明在您对其进行任何其他操作之前,您应该zip
列出这些列表。
>>> zippedLists = zip(X, Y)
zippedLists
将是包含X
和Y
中相应元素的元组列表:
>>> list(zippedLists)
[([1, 2, 3], [2, 4]), ([5, 5], [1, 4, 6, 6]), ([1], [1, 3])]
现在,您可以使用sorted
的key
参数,根据第一个元素的长度重新排列元组:
>>> sortedZippedLists = sorted(zippedLists, key=lambda x: len(x[0]))
>>> list(sortedZippedLists)
[([1], [1, 3]), ([5, 5], [1, 4, 6, 6]), ([1, 2, 3], [2, 4])]
然后unzip the lists,如果你需要。
>>> sortedX, sortedY = zip(*sortedZippedLists)
>>> list(sortedX)
[[1], [5, 5], [1, 2, 3]]
>>> list(sortedY)
[[1, 3], [1, 4, 6, 6], [2, 4]]
或者,作为单个表达式:
zip(*sorted(zip(X,Y), key=lambda x: len(x[0])))
答案 1 :(得分:0)
[Y[i] for i in list(zip(*sorted(zip(X, range(len(X))), key=lambda x:len(x[0]))))[1]]
In [6]: X
Out[6]: [[1, 2, 3], [5, 5], [1]]
In [7]: Y
Out[7]: [[2, 4], [1, 4, 6, 6], [1, 3]]
In [8]: [Y[i] for i in list(zip(*sorted(zip(X, range(len(X))), key=lambda x:len(x[0]))))[1]]
Out[8]: [[1, 3], [1, 4, 6, 6], [2, 4]]