2013-11-25 16 views
15

Czy istnieje sposób użycia metody sort() lub innej metody sortowania listy według kolumny? Powiedzmy mam listę:Jak sortować tablicę wielowymiarową według kolumny?

[ 
[John,2], 
[Jim,9], 
[Jason,1] 
] 

I chciałem się rozwiązać to tak, że będzie wyglądać następująco:

[ 
[Jason,1], 
[John,2], 
[Jim,9], 
] 

Jaki byłby najlepszym sposobem na to zrobić?

Edit:

Teraz używam do indeksu z zakresu błędu. Mam dwuwymiarową tablicę, która pozwala powiedzieć 1000 wierszy b 3 kolumny. Chcę to posortować na podstawie trzeciej kolumny. Czy to odpowiedni kod?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2]) 
+0

patrz: http: // stackoverflow.com/questions/2828059/sorting-array-in-numpy-by-column – duhaime

+0

W tej chwili pojawia się błąd indeksu poza zasięgiem. Mam dwuwymiarową tablicę, która pozwala powiedzieć 1000 wierszy b 3 kolumny. Chcę to posortować na podstawie trzeciej kolumny. Czy to odpowiedni kod? sorted_list = sorted (list_not_sorted, key = lambda x: x [2]) –

+0

W odpowiedzi na twoją edycję, ponieważ listy są indeksowane zero, tak x [2] jest trzecią kolumną. Morał tej historii polega na tym, że można użyć klawisza i lambda lub faktycznej funkcji do sortowania według niektórych postanowień funkcji "posortowane" i "sortuj". – squiguy

Odpowiedz

22

Tak. sorted wbudowaną akceptuje key argument:

sorted(li,key=lambda x: x[1]) 
Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]] 

nuta że sorted zwraca nową listę. Jeśli chcesz sortować w miejscu, użyj metody .sort twojej listy (która również, dogodnie, przyjmuje argument key).

lub alternatywnie

from operator import itemgetter 
sorted(li,key=itemgetter(1)) 
Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]] 

Read more on the python wiki.

+0

Może chcesz nadmienić, że to zwróci nową listę. – iCodez

+1

Rzeczywiście. Jeśli chcesz zmodyfikować oryginalną listę, będzie to "li.sort (key = cokolwiek)". – user2357112

6

Możesz użyć posortowanej metody za pomocą klucza.

sorted(a, key=lambda x : x[1]) 
0

Można użyć list.sort z jego opcjonalnie key parameter i lambda expression:

>>> lst = [ 
...  ['John',2], 
...  ['Jim',9], 
...  ['Jason',1] 
... ] 
>>> lst.sort(key=lambda x:x[1]) 
>>> lst 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
>>> 

To będzie posortować listę w miejscu.


Zauważ, że dla dużych list, to będzie szybciej korzystać operator.itemgetter zamiast lambda:

>>> from operator import itemgetter 
>>> lst = [ 
...  ['John',2], 
...  ['Jim',9], 
...  ['Jason',1] 
... ] 
>>> lst.sort(key=itemgetter(1)) 
>>> lst 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
>>> 
+0

Czym dokładnie jest klucz "lambda"? –

+0

@ user3024130 - 'lambda' tworzy funkcję inline dla parametru' key'. Dodałem link do lepszego wyjaśnienia. Użycie 'lambda' nie różni się od zrobienia' def func (x): return x [1] ', a następnie' lst.sort (key = func) '. – iCodez

+0

OK, to ma sens. Jak byś posortował go od najwyższego do najniższego, a nie od najniższego do najwyższego? –

0

Opcjonalny key parametrem sort/sorted jest funkcją. Funkcja jest wywoływana dla każdego elementu i zwracane wartości określają kolejność sortowania

>>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]] 
>>> def my_key_func(item): 
...  print("The key for {} is {}".format(item, item[1])) 
...  return item[1] 
... 
>>> sorted(lst, key=my_key_func) 
The key for ['John', 2] is 2 
The key for ['Jim', 9] is 9 
The key for ['Jason', 1] is 1 
[['Jason', 1], ['John', 2], ['Jim', 9]] 

biorąc print z funkcji pozostawia

>>> def my_key_func(item): 
...  return item[1] 

Funkcja ta jest na tyle prosty, aby napisać „inline” jako funkcja lambda

>>> sorted(lst, key=lambda item: item[1]) 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
0
sorted(list, key=lambda x: x[1]) 

Uwaga: to działa na zmiennej czasowej także.

Powiązane problemy