如何在Python中按行排序二维数组?

24 投票
5 回答
135754 浏览
提问于 2025-04-15 18:43

我有一个二维数组,大小是3行10列,我想按照第二行的数值,从小到大进行排序。

5 个回答

11

与其使用 lambda x: x[1],不如用 operator.itemgetter 作为排序函数的关键字。itemgetter(n) 会创建一个函数,这个函数可以从列表中获取第 n 个项目。

>>> matrix = [ [4,5,6], [1,2,3], [7,0,9]]
>>> from operator import itemgetter
>>> sorted(matrix, key=itemgetter(1))
[[7, 0, 9], [1, 2, 3], [4, 5, 6]]
44

你的“二维数组”长什么样子呢?

比如说:

>>> a = [
     [12, 18, 6, 3], 
     [ 4,  3, 1, 2], 
     [15,  8, 9, 6]
]
>>> a.sort(key=lambda x: x[1])
>>> a
[[4,  3,  1, 2], 
 [15, 8,  9, 6], 
 [12, 18, 6, 3]]

不过我猜你想要的可能是这样的:

>>> a = [
     [12, 18, 6, 3], 
     [ 4,  3, 1, 2], 
     [15,  8, 9, 6]
]
>>> a = zip(*a)
>>> a.sort(key=lambda x: x[1])
>>> a
[(6,  1,  9), 
 (3,  2,  6), 
 (18, 3,  8), 
 (12, 4, 15)]
>>> a = zip(*a)
>>> a
[(6, 3, 18, 12), 
 (1, 2,  3,  4), 
 (9, 6,  8, 15)
]
22

Python本身并没有“二维数组”这个概念,它只有一维的列表作为内置类型,还有在标准库模块array中的一维数组。虽然有一些第三方库,比如numpy,可以提供可以在Python中使用的多维数组,但如果你在使用这些库的时候,应该提到它们,而不是单纯说“在Python中”,对吧?-)

所以我假设你所说的“二维数组”是指一个列表里面包含多个列表,比如:

lol = [ range(10), range(2, 12), range(5, 15) ]

或者类似的结构——也就是说,一个列表里面有3个元素,每个元素又是一个包含10个元素的列表,而“第二行”就是子列表项lol[1]。是的,这里有很多假设,但你的问题模糊得让人抓狂,没办法不做假设。如果你不想让别人猜测你的意思(而且可能猜错),请修改你的问题,提供更清晰的描述和一个例子!

在这些假设下,你可以按照需要的顺序对这3个子列表进行排序,以便排序第二个子列表,比如:

indices = range(10)
indices.sort(key = lol[1].__getitem__)
for i, sublist in enumerate(lol):
  lol[i] = [sublist[j] for j in indices]

这里的一般方法是先对索引范围进行排序,然后使用这个排序好的范围来重新排列所有的子列表。

如果你实际上有其他问题,当然会有不同的解决方案;-)。

撰写回答