我有2d数组,维度为3x10,我想按第2行中的值排序,从最低值到最高值。
答案 0 :(得分:28)
你的“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]]
但我想你想要这样的东西:
>>> 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)
]
答案 1 :(得分:19)
Python本身没有“2d数组” - 它有(1d)列表作为内置函数,以及(1d)数组在标准库模块array中。有一些第三方库,例如numpy
,它们提供了可用于Python的多维数组,但当然如果你使用其中的一些,你会提到这样的第三方库,而不仅仅是说“在Python“,正确? - )
所以我假设“2d数组”是指列表,例如:
lol = [ range(10), range(2, 12), range(5, 15) ]
等 - 即具有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]
这里的一般方法是对索引范围进行排序,然后只使用适当排序的范围来重新排序所有正在播放的子列表。
如果你确实遇到了不同的问题,那么当然会有不同的解决方案; - )。
答案 2 :(得分:6)
您可以使用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]]
答案 3 :(得分: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]]
答案 4 :(得分: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是相反的,因为目标是将值从高到低排序。