Sortuj krotki na podstawie drugiego parametru

93

Mam listę krotek, które wyglądają mniej więcej tak:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Chcę, aby powstała lista posortowana w porządku rosnącym według drugiej wartości krotki. Więc L [0] powinno być ("Person 2", 8)po sortowaniu.

Jak mogę to zrobić? Korzystanie z Pythona 3.2.2 Jeśli to pomaga.

user974703
źródło
1
możliwy duplikat sortowania krotki zawierającej krotki
JBernardo,

Odpowiedzi:

187

Możesz użyć tego keyparametru, aby list.sort():

my_list.sort(key=lambda x: x[1])

lub nieco szybciej,

my_list.sort(key=operator.itemgetter(1))

(Podobnie jak w przypadku każdego modułu, musisz import operatormieć możliwość korzystania z niego.)

Sven Marnach
źródło
3
Próbowałem użyć L.sort(key=operator.itemgetter(1))w moim kodzie, ale otrzymałem NameError, że „operator” nie jest zdefiniowany. Czy muszę importować coś specjalnego?
user974703
3
Zrobiłem trochę wyszukiwania, musisz użyć, import operatoraby użyć funkcji. Jeśli dodasz to do swojej odpowiedzi, oznaczę ją jako zaakceptowaną.
user974703
Testowanie z timeit.timeit (opcje domyślne) nie ma dużej różnicy między tymi dwoma podejściami: operator.itemgetter = 1,05 µs, lambda = 1,25 µs na iterację
Noel Evans
Dzięki za rozwiązanie my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice
1
Jeśli nie znasz słowa kluczowego lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx
12

A jeśli używasz Pythona 3.X, możesz zastosować tę sortedfunkcję na liście mylist. To tylko dodatek do odpowiedzi, której @Sven Marnach udzielił powyżej.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 
Samuel Nde
źródło
To jest po prostu funkcja wbudowana, która zwraca nową listę. Twoja odpowiedź nie wnosi nic do tych, które już tu są, ponieważ jest jasne, że gdybyś chciał mieć nową listę, użyłbyś sortedzamiast list.sort.
miradulo
2
@SamuelNde Przewinąłem tutaj, ponieważ nie byłem pewien, czy wyrażenie działa tak samo dla sortowania, więc pomogło mi.
Czerwony Kapturek
Zgadzam się
-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

wyjście -> Rogue One

Darrell White
źródło
Kilka myśli: to właściwie nie odpowiada na pytanie (jak uzyskać listę posortowaną według wartości w krotce); Możesz rozpakować krotkę bezpośrednio w swojej pętli (dla filmu wartość w listoftuples:); nadpisałeś typ „krotka”; I faktycznie można to zrobić za pomocą pojedynczego rozpoznania listy: (return posortowane ((wartość, film) dla filmu, wartość w listoftuples) [- 1] [1])
RFox
Doceniam to, do czego zmierzasz, ale twierdzę, że brakuje mu elegancji i można go ulepszyć. Generalnie zmiana kolejności elementów w krotce takiej jak ta byłaby uznana za złą praktykę. Myślę, że kwestie dotyczące rozumienia listy i rozpakowywania krotek pozostałyby aktualne. I zniechęcałbym każdego, kto używa tej metodologii zamiast zaakceptowanej odpowiedzi.
RFox
Jestem niezdolny i nie udało mi się uzyskać wysłanego przez Ciebie kodu do pracy, najprawdopodobniej błąd użytkownika
Darrell White
ale zmieniłem to trochę i bez wątpienia twoja odpowiedź jest 200 razy lepsza.
Darrell White
def findMaxSales (listoftuples): newlist = sortowane ((value, movies) for movies, value in listoftuples) return newlist [-1] [1] movieList = [("Finding Dory", 486), ("Captain America: Civil War ", 408), (" Deadpool ", 363), (" Zwierzogród ", 341), (" Łotr ", 529), (" Sekretne życie zwierząt domowych ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print (findMaxSales (movieList))
Darrell White