2个清单列表。根据列表的列表对两者进行排序

时间:2016-04-04 15:22:30

标签: python sorting

我有两个清单:

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]]

2 个答案:

答案 0 :(得分:6)

  

列表X和Y

的元素之间存在一对一的对应关系

这表明在您对其进行任何其他操作之前,您应该zip列出这些列表。

>>> zippedLists = zip(X, Y)

zippedLists将是包含XY中相应元素的元组列表:

>>> list(zippedLists)
[([1, 2, 3], [2, 4]), ([5, 5], [1, 4, 6, 6]), ([1], [1, 3])]

现在,您可以使用sortedkey参数,根据第一个元素的长度重新排列元组:

>>> 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]]