2011-05-20 18 views
5

Mam listę list w następującym formacie:Jak posortować listę, sprawdzając wartości w podlistrze w pythonie?

[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 

Chciałbym uporządkować czy w skuteczny sposób w Pythonie z wykorzystaniem numerycznych elementy listy, dopasowanie pierwszy element, a kiedy jest taka sama, użyj drugiego, i tak dalej. Wynik byłby coś jak (muszę odwrotnej kolejności ten czas):

['a',[10]] 
['c',[5,10]] 
['e',[5,1,-1]] 
['d',[5,1,-10] 
['b',[1]] 

Dzięki!

+1

Nie ma to nic wspólnego z rekurencją, więc usunę tag –

Odpowiedz

5

myślę listy porównać jak chcesz, domyślnie, jeśli odwrócone:

>>> data = [['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]] 
>>> sorted(data, reverse = True, key = lambda pair: pair[1]) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

Miałeś bracketingu błąd na liście wejściowej, to ustalone w kodzie powyżej.

+0

+1, pobity do tego. Zauważ, że '' posortowane() '' zwraca nową listę; jeśli chcesz zmodyfikować istniejącą listę w miejscu, użyj jej metody '' sort() '', która przyjmuje takie same argumenty, np. '' data.sort (reverse = True, key = lambda pair: pair [1]) '' . – Blair

+0

Ha! Miło wiedzieć, że dzieje się to domyślnie. Próbowałem dowiedzieć się, jak to zrobić we własnym imieniu :) –

0

Zastosowanie key aby wybrać drugi element na liście, a reverse zmienić kierunek:

>>> l=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10], ['e',[5,1,-1]]] 
>>> sorted(l, key=lambda e:e[1], reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

Listy są klasyfikowane przez porównanie ich elementów w porządku, podobnie jak leksykon lub regularne słownika. Nazywa się to "porównaniem leksograficznym".

1
>>> from operator import itemgetter 
>>> L=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 
>>> sorted(L, key=itemgetter(1), reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 
>>> 

Użyłbym tutaj itemgetter (1), który jest mniej więcej równoważny funkcji lambda w innych odpowiedziach. To skutecznie robi sortowanie z kluczem będącym podlisty, ponieważ są one pozycją nr 1. (numer pozycji 0 to litery ae)

Powiązane problemy