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.


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.)


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]) 

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


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.