2010-11-13 17 views
149

Mam listę list. Na przykład,Jak posortować listę list według określonego indeksu listy wewnętrznej?

[ 
[0,1,'f'], 
[4,2,'t'], 
[9,4,'afsd'] 
] 

Gdybym chciał, aby posortować listę według zewnętrzną dziedzinie strun wewnętrznych list, w jaki sposób to zrobić w Pythonie?

+3

Link do poradnika: http://wiki.python.org/moin/HowTo/Sorting/ –

+3

użyteczne łącza: http://stackoverflow.com/questions/18142090/python-sort-a-list- of-list-by-item-in-the-sublist –

Odpowiedz

212

To jest zadanie dla itemgetter

>>> from operator import itemgetter 
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>> sorted(L, key=itemgetter(2)) 
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 

Jest również możliwe użycie funkcji lambda tu jednak funkcja lambda jest wolniejszy w tym prostym przypadku

+0

Co, jeśli chciałbym zignorować przypadek? – bzupnick

+5

@ bzupnick, użyj 'key = lambda x: x [2] .casefold()'. Jeśli twój Python nie jest wystarczająco nowy, po prostu użyj '.lower()' zamiast '.casefold()' –

+0

x = [[[5,3], 1.0345], [[5,6], 5.098], [ [5,4], 4,89], [[5,1], 5.97]] Czy z taką listą możemy sortować za pomocą itemgetter() w odniesieniu do elementów w x [0] [1]? – nidHi

110

w miejscu

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>> l.sort(key=lambda x: x[2]) 

nie na miejscu, posortowane:

>>> sorted(l, key=lambda x: x[2]) 
+1

Czy możesz podać więcej szczegółów na temat 'na miejscu' i' nie na miejscu'? – qun

+4

@qun, "na miejscu" oznacza, że ​​pamięć starej listy jest ponownie używana dla posortowanej. "nie na miejscu" oznacza, że ​​stara lista pozostaje niezmieniona i tworzona jest nowa lista. –

+0

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Z taką listą jest , jak możemy sortować w odniesieniu do elementów w x [0] [1]? – nidHi

6

Jak to:

import operator 
l = [...] 
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index)) 
50

Itemgetter pozwala sortować według wielu kryteriów/kolumn:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1)) 
+2

Myślę, że ta odpowiedź jest bardzo ważna. Myślę, że ludzie próbujący sortować według wewnętrznych indeksów tablicy spadną tutaj, ale ludzie, którzy chcą sortować według MULTIPLE wewnętrznych indeksów tablicowych, zaczną tutaj, a twoja odpowiedź pomogła mi zobaczyć, że itemgetter zrobi to za Ciebie! – ZekeDroid

3

liczne kryteria mogą być również realizowane za pośrednictwem funkcji lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0])) 
2

myślę lambda funkcja może rozwiązać twój problem.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']] 

#let's assume we want to sort lists by last value (old_list[2]) 
new_list = sorted(old_list, key=lambda x: x[2]) 

#Resulst of new_list will be: 

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 
Powiązane problemy