我有一个由几个子列表组成的简单列表,如下所示:
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]]
这根本不是我需要的。
答案 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