Python 同时对多个列表排序

Python 同时对多个列表排序,python,sorting,Python,Sorting,我有三个由相同数量的元素组成的列表: a = [0.3, 1.5, 0.2, 2.6] b = [1, 2, 3, 4] c = [0.01, 0.02, 0.03, 0.04] 我需要根据lista中的递减值同时对这三个列表进行排序。这意味着我必须根据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\u s现在只需通过减少值

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

a = [0.3, 1.5, 0.2, 2.6]
b = [1, 2, 3, 4]
c = [0.01, 0.02, 0.03, 0.04]
我需要根据list
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\u s
现在只需通过减少值进行排序,而
b\u s
c\u s
则根据此排序更改其项目位置。

简短回答 长话短说 首先,您必须压缩三个列表,创建一个项目列表:

>>> 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)]
然后,对列表进行排序。元组列表按其第一个元素排序(当第一个元素相等时,使用第二个元素,依此类推):

然后你“解压”列表。解压与使用每个元组作为参数调用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)]

这会将它们转换为元组,因此您可能需要执行
映射(list,zip(*sorted
)。。。
>>> 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)]