1

我有一个由几个子列表组成的简单列表,如下所示:

a = [[4, 3, 2, 1], [5, 8, 7, 6], [12, 11, 10, 9]]

我需要根据子列表中的元素a[1]按降序对其进行排序,所以它会像这样:

sorted_a = [(3, 2, 1, 4), (8, 7, 6, 5), (11, 10, 9, 12)]

我试过使用排序:

sorted_a = sorted(a, key=lambda x: -x[2])

但它返回:

[[12, 11, 10, 9], [5, 8, 7, 6], [4, 3, 2, 1]]

这根本不是我需要的。

4

3 回答 3

5

所以你真的想对子列表进行排序?

zip(*sorted(zip(*a), key=lambda x: -x[1]))
于 2013-10-31T23:55:16.340 回答
1

也许这就是你要找的东西:

a = [[4, 3, 2, 1], [5, 6, 7, 8], [12, 11, 10, 9]]
[sorted(list) for list in a]

回报:[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

或者,如果您还想按第一个元素排序:

a = [[4, 3, 2, 1], [12, 11, 10, 9], [5, 6, 7, 8]]
sorted([sorted(list) for list in a], key=min)

还返回:[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

于 2013-11-01T00:08:38.917 回答
0

这听起来令人困惑 ;-) 从评论中,听起来您确实想要采用对 a[1] 进行反向排序的排列,并将该排列应用于所有子列表。好吧,任何 1-liner 都会非常模糊。所以这里有一个简单的方法来做到这一点:

a = [[4,3,2,1], [5,6,7,8], [12,11,10,9]]
# compute the permutation needed to reverse-sort a[1]
decorated = [(v, i) for i, v in enumerate(a[1])]
decorated.sort(reverse=True)
perm = [i for v, i in decorated]
for sublist in a:
    sublist[:] = [sublist[i] for i in perm]
print a
于 2013-11-01T00:15:14.473 回答