同时对多个列表进行排序

12

我有三个列表,它们由相同数量的元素组成:

a = [0.3, 1.5, 0.2, 2.6]
b = [1, 2, 3, 4]
c = [0.01, 0.02, 0.03, 0.04]

我需要同时根据列表 a 中递减的值对这三个列表进行排序。这意味着我必须根据列表 a 进行排序,但是列表 a 也需要被排序。

a_s = [2.6, 1.5, 0.3, 0.2]
b_s = [4, 2, 1, 3]
c_s = [0.04, 0.02, 0.01, 0.03]

通过按值递减的顺序对a_s进行排序,而b_sc_s则根据此排序更改其项目位置。

1个回答

21

简短回答

a_s, b_s, c_s = map(list, zip(*sorted(zip(a, b, c), reverse=True)))

长答案

首先,您需要将三个列表压缩成一个项目列表:

>>> a = [0.3, 1.5, 0.2, 2.6]
>>> b = [1, 2, 3, 4]
>>> c = [0.01, 0.02, 0.03, 0.04]
>>> z = zip(a, b, c)
>>> z
[(0.3, 1, 0.01), (1.5, 2, 0.02), (0.2, 3, 0.03), (2.6, 4, 0.04)]

然后,您对此列表进行排序。一个元组列表按其第一个元素排序(当第一个元素相等时,使用第二个元素,以此类推):

>>> zs = sorted(z, reverse=True)
>>> zs
[(2.6, 4, 0.04), (1.5, 2, 0.02), (0.3, 1, 0.01), (0.2, 3, 0.03)]

然后你需要“解压”列表。解压就相当于对每个元组调用zip函数,使用星号语法实现:

>>> u = zip(*zs)
>>> u
[(2.6, 1.5, 0.3, 0.2), (4, 2, 1, 3), (0.04, 0.02, 0.01, 0.03)]

你得到了一个由元组组成的列表,但你想要的是列表。因此,你需要将列表构造器映射到这些项上:
>>> u
[(2.6, 1.5, 0.3, 0.2), (4, 2, 1, 3), (0.04, 0.02, 0.01, 0.03)]
>>> map(list, u)
[[2.6, 1.5, 0.3, 0.2], [4, 2, 1, 3], [0.04, 0.02, 0.01, 0.03]]

您可以将列表拆分为变量:
>>> a_s, b_s, c_s = map(list, u)

观察

在排序时,您可以明确指示哪个项目将用于排序,而不是依赖于元组的默认排序:

>>> from operator import itemgetter
>>> sorted(z, key=itemgetter(1))  # Sort by second item
[(0.3, 1, 0.01), (1.5, 2, 0.02), (0.2, 3, 0.03), (2.6, 4, 0.04)]
>>> sorted(z, key=itemgetter(2))  # Sort by third item
[(0.3, 1, 0.01), (1.5, 2, 0.02), (0.2, 3, 0.03), (2.6, 4, 0.04)]

2
这将把它们转换为元组,因此您可能希望执行map(list,zip(* sorted ... - Mark Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接