How to sort 2d array by row in python?
I have 2d array, dimension 3x10, 开发者_Python百科and I want to sort by values in 2nd row, from lowest to highest value.
How does your "2D array" look like?
For example:
>>> 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]]
But I guess you want something like this:
>>> 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)
]
Python, per se, has no "2d array" -- it has (1d) lists as built-ins, and (1d) arrays in standard library module array. There are third-party libraries such as numpy
which do provide Python-usable multi-dimensional arrays, but of course you'd be mentioning such third party libraries if you were using some of them, rather than just saying "in Python", right?-)
So I'll assume that by "2d array" you mean a list of lists, such as:
lol = [ range(10), range(2, 12), range(5, 15) ]
or the like -- i.e. a list with 3 items, each item being a list with 10 items, and the "second row" would be the sublist item lol[1]
. Yeah, lots of assumptions, but your question is so maddeningly vague that there's no way to avoid making assumptions - edit your Q to clarify with more precision, and an example!, if you dislike people trying to read your mind (and probably failing) as you currently make it impossible to avoid.
So under these assumptions you can sort each of the 3 sublists in the order required to sort the second one, for example:
indices = range(10)
indices.sort(key = lol[1].__getitem__)
for i, sublist in enumerate(lol):
lol[i] = [sublist[j] for j in indices]
The general approach here is to sort the range of indices, then just use that appropriately sorted range to reorder all the sublists in play.
If you actually have a different problem, there will of course be different solutions;-).
Rather than use lambda x: x[1]
you can use operator.itemgetter as the key to the sort or sorted functions. itemgetter(n) creates a function that gets the nth item from a list.
>>> 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]]
Well, if you're talking about standard python lists, this is easy: mylist[1].sort()
. For example:
>>> 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]]
This is a little function I wrote for this purpose:
def sorted_table(data, column=0, reverse=False):
return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse)
Actually, I had a bit more complex requirement, which is to sort the table by two columns. It turns out that the cmp()
function is quite versatile; this is my original function:
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
The b and a are reversed in the first case, since the goal was to sort the values fro higher to lower.
精彩评论