繁体   English   中英

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

[英]Sort list according to elements in sublist

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

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

这根本不是我所需要的。

所以您实际上要对子列表进行排序?

zip(*sorted(zip(*a), key=lambda x: -x[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]]

这听起来令人困惑;-)从注释中可以肯定,这听起来像是您想要对a [1]进行反向排序的排列,然后将该排列应用于所有子列表。 好吧,任何用于这种情况的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM