Mam dictionary
: klucze są ciągami, wartości są liczbami całkowitymi.
Przykład:
stats = {'a':1000, 'b':3000, 'c': 100}
Chciałbym uzyskać 'b'
odpowiedź, ponieważ jest to klucz o wyższej wartości.
Wykonałem następujące czynności, używając listy pośredniej z odwróconymi krotkami klucz-wartość:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
Czy to jest lepsze (a nawet bardziej eleganckie) podejście?
python
dictionary
max
Ricafeal
źródło
źródło
max(stats)
?max(stats)
użyje etykiet jako kluczy (zwróci'c'
, pod warunkiem , że jest to maksymalna etykieta),max(stats, key=lambda key: stats[key])
to jest to , co było po OP (co zwróci'b'
, etykieta o maksymalnej wartości indeksowanej). Czy to jest jaśniejsze?Odpowiedzi:
Możesz użyć
operator.itemgetter
do tego:I zamiast budowania nowej listy w użyciu pamięci
stats.iteritems()
.key
Parametr domax()
funkcji jest funkcja, która oblicza klucz, który jest używany do określenia, w jaki sposób przedmioty rangi.Pamiętaj, że jeśli miałbyś mieć inną parę klucz-wartość „d”: 3000, ta metoda zwróci tylko jedną z dwóch, mimo że obie mają maksymalną wartość.
Jeśli używasz Python3:
źródło
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
źródło
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
Przetestowałem WIELE wariantów i jest to najszybszy sposób na zwrócenie klucza dykta z maksymalną wartością:
Aby dać Ci pomysł, oto kilka metod kandydujących:
Słownik testowy:
A wyniki testu w Pythonie 3.2:
I w Pythonie 2.7:
Możesz zobaczyć, że
f1
jest to najszybszy w Pythonie 3.2 i 2.7 (lub, bardziej szczegółowo,keywithmaxval
na początku tego postu)źródło
f7
tof1
po prostu nie nadawanie nazwy obiektowi pośredniemu.f7
powinien być (bardzo nieznacznie) szybszy niżf1
, nie znacznie wolniejszy. I to właśnie otrzymuję:>>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
Jeśli potrzebujesz znać tylko klucz o maksymalnej wartości, możesz to zrobić bez niego
iterkeys
lubiteritems
ponieważ iteracja przez słownik w Pythonie jest iteracją przez jego klucze.EDYTOWAĆ:
Z komentarzy, @ user1274878:
Tak...
max
Opcjonalny
key
argument opisuje, jak porównywać elementy, aby uzyskać maksimum między nimi:Zwrócone wartości zostaną porównane.
Dict
Python dict to tablica skrótów. Kluczem słownika jest skrót obiektu zadeklarowanego jako klucz. Ze względu na wydajność iteracja jest wykonywana za pomocą klucza.
Dlatego możemy go użyć do pozbycia się operacji uzyskiwania listy kluczy.
Zamknięcie
stats
Zmienny dostępny przez__closure__
atrybutlambda
funkcji jako wskaźnik do wartości zmiennej określonej w zakresie macierzystego.źródło
Przykład:
jeśli chcesz znaleźć wartość maksymalną za pomocą klucza, być może śledzenie może być proste, bez żadnych istotnych funkcji.
wyjście jest kluczem o maksymalnej wartości.
źródło
Oto kolejny:
Funkcja
key
po prostu zwraca wartość, która powinna być użyta do rankingu imax()
natychmiast zwraca żądany element.źródło
max(stats, key=lambda k: stats[k])
Jeśli nie zależy ci na wartości (byłbym zaskoczony, ale) możesz:
Podoba mi się rozpakowywanie krotki lepiej niż indeks [0] na końcu wyrażenia. Nigdy nie bardzo lubię czytelność wyrażeń lambda, ale uważam, że jest ona lepsza niż operator.itemgetter (1) IMHO.
źródło
_
można użyć zamiastignored
.ignored
wygląda dość brzydko, ale niektórzy ludzie są przeciwni używaniu_
z kilku powodów. Myślę, że pierwszy fragmentBiorąc pod uwagę, że więcej niż jeden wpis mój ma wartość maksymalną. Zrobiłbym listę kluczy, które mają maksymalną wartość jako swoją wartość.
To da ci „b”, a także dowolny inny maksymalny klawisz.
Uwaga: W przypadku Python 3 użyj
stats.items()
zamiaststats.iteritems()
źródło
max
były drogie (np. Słownik LONG), polecam,[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
jeśli chcesz mieć jedną linijkę, w przeciwnym razie obliczm = ...
wcześniej.Możesz użyć:
Aby zwrócić klucz, użyj pary wartości:
źródło
Aby uzyskać maksymalną wartość klucza / wartości słownika
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Oczywiście, jeśli chcesz uzyskać tylko klucz lub wartość z wyniku, możesz użyć indeksowania krotek. Na przykład, aby uzyskać klucz odpowiadający maksymalnej wartości:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
Wyjaśnienie
Metoda słownikowa
items()
w Pythonie 3 zwraca obiekt widoku słownika. Gdy obiekt widoku jest iterowany,max
funkcja zwraca elementy słownika w postaci krotek formularza(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Kiedy używasz
lambda
wyrażenialambda x: x[1]
, w każdej iteracjix
jest jedną z tych krotek(key, value)
. Tak więc, wybierając odpowiedni indeks, decydujesz, czy chcesz porównać według kluczy, czy według wartości.Python 2
W wersjach Python 2.2+ ten sam kod będzie działał. Lepiej jednak użyć
iteritems()
metody słownikowej zamiastitems()
wydajności.Notatki
Ta odpowiedź oparta jest na komentarzach do do odpowiedzi Climbs_lika_Spyder .
Używany kod został przetestowany na Python 3.5.2 i Python 2.7.10.
źródło
źródło
Według iterowanych rozwiązań za pomocą komentarzy w wybranej odpowiedzi ...
W Pythonie 3:
W Python 2:
źródło
Przybyłem tutaj, szukając sposobu zwrotu w
mydict.keys()
oparciu o wartośćmydict.values()
. Zamiast zwrócić tylko jeden klucz, chciałem zwrócić górny x liczbę wartości.To rozwiązanie jest prostsze niż użycie
max()
funkcji i możesz łatwo zmienić liczbę zwracanych wartości:Jeśli chcesz mieć pojedynczy klucz o najwyższej pozycji, po prostu użyj indeksu:
Jeśli chcesz uzyskać dwa najwyższe klucze w rankingu, po prostu użyj wycinania listy:
źródło
max()
. Jest jasne, że jest najszybszy. Pomyślałem, że zaoferuję inne rozwiązanie z korzyścią krojenia, które wtedy było mi bardziej przydatneNie byłem zadowolony z żadnej z tych odpowiedzi.
max
zawsze wybiera pierwszy klucz o maksymalnej wartości. Słownik może mieć wiele kluczy o tej wartości.Opublikowanie tej odpowiedzi na wypadek, gdyby pomogło komuś. Zobacz poniższy post SO
Jakie maksimum wybiera Python w przypadku remisu?
źródło
Z
collections.Counter
tobą możesz zrobićW razie potrzeby możesz po prostu zacząć od pustego
collections.Counter
i dodać do niegoźródło
Kolejka sterty jest uogólnionym rozwiązaniem, które pozwala wyodrębnić n głównych kluczy uporządkowanych według wartości:
Uwaga
dict.__getitem__
to metoda wywoływana przez cukier syntaktycznydict[]
. W przeciwieństwie dodict.get
zwróci,KeyError
jeśli klucz nie zostanie znaleziony, co tutaj nie może wystąpić.źródło
max((value, key) for key, value in stats.items())[1]
źródło
+1 do najprostszego rozwiązania @Arica Coady .
A także jeden ze sposobów losowego wyboru jednego z kluczy o maksymalnej wartości w słowniku:
źródło
źródło
Co powiesz na:
źródło
zip(stats.keys(), stats.values())
to po prostu dłuższy sposób na pisaniestats.items()
. Po wprowadzeniu tej zmiany odpowiedź będzie prawie identyczna z kilkoma starszymi odpowiedziami.items
to nie to samo cozip
. Po prostu daje ten sam wynik.Przetestowałem zaakceptowaną odpowiedź ORAZ najszybsze rozwiązanie wilka na bardzo podstawowej pętli, a pętla była szybsza niż obie:
wyniki:
źródło
Dla użytkowników naukowych pythonów, oto proste rozwiązanie wykorzystujące Pandy:
źródło
W przypadku, gdy masz więcej niż jeden klucz o tej samej wartości, na przykład:
Możesz uzyskać kolekcję ze wszystkimi kluczami o maksymalnej wartości, jak poniżej:
źródło
Znacznie prostsze do zrozumienia podejście:
Wyjście: [„a”, „g”]
Teraz możesz wybrać tylko jeden klucz:
źródło