如何在python中按行排序2d数组?

use*_*522 17 python sorting

我有2d数组,维度3x10,我想按第2行中的值排序,从最低到最高值.

Mes*_*ssa 30

你的"2D阵列"是怎样的?

例如:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

但我想你想要这样的东西:

>>> 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)
]
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 20

Python本身没有"2d数组" - 它有(1d)列表作为内置函数,而(1d)数组在标准库模块数组中.有第三方库,例如numpy提供可用于Python的多维数组,但当然你会提到这些第三方库,如果你使用其中的一些,而不只是说"在Python中",对吧? - )

所以我假设"2d数组"是指列表列表,例如:

lol = [ range(10), range(2, 12), range(5, 15) ]
Run Code Online (Sandbox Code Playgroud)

等等 - 即具有3个项目的列表,每个项目是具有10个项目的列表,并且"第二行"将是子列表项目lol[1].是的,很多假设,但你的问题是如此令人抓狂,以至于没有办法避免做出假设 - 编辑你的Q以更精确地澄清,以及一个例子!如果你不喜欢人们试图读你的思想(并且可能失败)因为你目前无法避免.

因此,根据这些假设,您可以按照排序第二个子列表所需的顺序对3个子列表中的每个子列表进行排序,例如:

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

这里的一般方法是对索引范围进行排序,然后使用适当排序的范围来重新排序所有正在进行的子列表.

如果你真的有不同的问题,当然会有不同的解决方案;-).


Dav*_*rby 6

而不是使用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]]
Run Code Online (Sandbox Code Playgroud)