根据子列表中的元素对列表进行排序

时间:2013-10-31 23:50:40

标签: python list sorting

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

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:

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

但它返回:

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

这根本不是我需要的。

3 个答案:

答案 0 :(得分:5)

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

zip(*sorted(zip(*a), key=lambda x: -x[1]))

答案 1 :(得分:1)

Perhapse这就是你要找的东西:

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

答案 2 :(得分:0)

这听起来令人困惑;-)从评论来看,听起来好像你想采取反转排序[1]的排列,并将该排列应用于所有子列表。那么,任何一个内衬都会非常模糊。所以这是一种直截了当的方法:

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