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

问题描述 投票:0回答:6

我有二维数组,尺寸为 3x10,我想按第二行中的值从最低到最高值排序。

python sorting
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 本身没有“2d 数组”——它有 (1d) 内置列表,以及标准库模块 array 中的 (1d) 数组。 有一些第三方库,例如

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]

这里的一般方法是对索引范围进行排序,然后使用适当排序的范围对播放中的所有子列表重新排序。

如果你确实遇到不同的问题,当然会有不同的解决方案;-)。


11
投票

您可以使用operator.itemgetter作为排序或排序函数的键,而不是使用

lambda x: x[1]
。 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]]

1
投票

好吧,如果你谈论的是标准 Python 列表,这很简单:

mylist[1].sort()
。例如:

>>> from random import randint
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)]
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]
>>> a_list[1].sort()
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]

0
投票

这是我为此目的编写的一个小函数:

def sorted_table(data, column=0, reverse=False):
    return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse)

其实,我有一个更复杂的需求,就是按两列对表格进行排序。事实证明,

cmp()
函数的用途相当广泛;这是我原来的功能:

def sort_report(data):
    """Sort report columns: first by value, then by label."""
    return sorted(data, cmp=lambda a,b: cmp(b[2], a[2]) or cmp(a[0], b[0])) # label is column 0; value is column 2

在第一种情况下,b 和 a 是相反的,因为目标是将值从高到低排序。


0
投票

为什么不使用“pandas”来排序? 它可以处理多列排序。

将 pandas 导入为 pd

列列表 = ['colA','colB','colC','colD']

数据矩阵 = [ [...],[...],[...],[...]]

df = pd.DataFrame(dataMatrix, columns=columnList)

rs = df.sort_values(['colA','colB','colC','colD'], 升序=[True,True,False,False])

© www.soinside.com 2019 - 2024. All rights reserved.