Literówka w deklarowanym zwrocie? W przeciwnym razie dlaczego 321? Czy nie powinno to być 320?
GreenMatt
3
@myself: OK, teraz widzę - to, czego potrzebujemy, to klucz do wpisu, w którym wartość wpisu jest minimalna. Proszę o lepsze sformułowanie pytania, ponieważ inni oczywiście myśleli tak samo jak ja.
GreenMatt
2
Dzień świadomości struktury danych: jeśli kiedykolwiek wyszukujesz (lub usuwasz) minimalny element, rozważ użycie kolejki priorytetowej lub sterty.
Pułkownik Panic
Odpowiedzi:
596
Najlepszy: min(d, key=d.get)- nie ma powodu, aby umieszczać bezużyteczną lambdawarstwę pośrednią lub wyciągać przedmioty lub klucze!
@ KarelBílek oznacza, że podałeś jako „d” listę np. [11, 22, 33]Zamiast słownika np {1: 11, 2:22, 3:33}. „d.get” jest ważne dla słownika, ale nie dla listy.
ToolmakerSteve,
9
co jeśli dwa różne klucze mają tę samą wartość? a oni są najmniejszą wartością? jak możesz sprawić, by zwrócił oba?
user3226932,
5
Czy można zastosować tę technikę, jeśli wartości dykt są listami, np .: d={"a":[10, None], "b":[20, None]}gdzie min oblicza się na podstawie d [klucz] [0]?
TrakJohnson
4
Jak to działa? Co to za funkcja min, myślałem, że min () przyjmuje jako argumenty tylko poszczególne wartości lub listy. W jaki sposób zapętla wszystkie wpisy w słowniku?
azureai
2
min()zwraca wartość z pierwszej posortowanej wartości. Klawisz wyznacz sposób sortowania wartości. key=d.getoznacza, że lista zostanie posortowana według wartości słownika.
notilas
45
Oto odpowiedź, która faktycznie daje rozwiązanie, o które poprosił PO:
>>> d ={320:1,321:0,322:3}>>> d.items()[(320,1),(321,0),(322,3)]>>># find the minimum by comparing the second element of each tuple>>> min(d.items(), key=lambda x: x[1])(321,0)
Używanie d.iteritems()będzie jednak bardziej wydajne w przypadku większych słowników.
Twoja odpowiedź jest bardzo przydatna, a inni prawdopodobnie się zgadzają: zapoznaj się z wieloma komentarzami na ten temat w zaakceptowanej odpowiedzi. Musiałem jednak wrócić dwa razy, aby go znaleźć: czy zastanowiłbyś się nad zaproponowaniem edycji zaakceptowanej odpowiedzi? Twój jest właściwie komplementarny.
aby utworzyć uporządkowaną klasę, musisz przesłonić 6 funkcji specjalnych, aby została wywołana przez funkcję min ()
metody te są __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__w kolejności, w której są mniejsze, mniejsze lub równe, większe niż, większe niż lub równe, równe, nie równe. na przykład powinieneś wdrożyć __lt__w następujący sposób:
Użyj funkcji zip, aby utworzyć iterator krotek zawierających wartości i klucze. Następnie zawiń go funkcją min, która przyjmuje minimum na podstawie pierwszego klawisza. Zwraca krotkę zawierającą parę (wartość, klucz). Indeks [1] służy do uzyskania odpowiedniego klucza
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
β.εηοιτ.βε
@ β.εηοιτ.βε, że lepiej?
rajn
-1
# python
d={320:1,321:0,322:3}
reduce(lambda x,y: x if d[x]<=d[y]else y, d.iterkeys())321
1) Redukcja jest ogólnie wolniejsza niż itertools. 2) Większość implementacji redukcji można wykonać prościej z dowolnym lub wszystkimi. 3) Jestem gigantycznym ustnikiem dla GvR. 4) Moduł operatora sprawia, że najprostsze lambdy nie są potrzebne, a złożone lambda powinny być zdefiniowane jako rzeczywiste funkcje. Może po prostu boję się programowania funkcjonalnego. ;)
MikeD,
@miked: powiedz mi więcej. co to jest gvr i co to jest moduł operatora? czy możesz opublikować linki? Mogę znać innych, ale nadal jestem tylko pośrednikiem w Pythonie. chętny do nauki! :-)
eruciform
GvR to Guido van Rossum, życzliwy dyktator Pythona na całe życie. Oto pięcioletni post wyjaśniający, dlaczego lisp-isms (mapa, filtr, redukcja, lambda) nie ma zbyt wiele miejsca w pythonie, a powody te są nadal aktualne. Moduł operatora ma zamienniki do wyodrębniania elementów : „lambda x: x [1]” w porównaniu do „itemgetter (1)” jest postacią dłuższą i prawdopodobnie zajmuje więcej czasu. Brakuje mi miejsca, ale zadawaj pytania!
Odpowiedzi:
Najlepszy:
min(d, key=d.get)
- nie ma powodu, aby umieszczać bezużytecznąlambda
warstwę pośrednią lub wyciągać przedmioty lub klucze!źródło
[11, 22, 33]
Zamiast słownika np{1: 11, 2:22, 3:33}
. „d.get” jest ważne dla słownika, ale nie dla listy.d={"a":[10, None], "b":[20, None]}
gdzie min oblicza się na podstawie d [klucz] [0]?min()
zwraca wartość z pierwszej posortowanej wartości. Klawisz wyznacz sposób sortowania wartości.key=d.get
oznacza, że lista zostanie posortowana według wartości słownika.Oto odpowiedź, która faktycznie daje rozwiązanie, o które poprosił PO:
Używanie
d.iteritems()
będzie jednak bardziej wydajne w przypadku większych słowników.źródło
operator.itemgetter(1)
.W przypadku wielu kluczy, które mają równą najniższą wartość, możesz skorzystać ze zrozumienia listy:
Równoważna wersja funkcjonalna:
źródło
min(d.items(), key=lambda x: x[1])[0]
źródło
źródło
key=d.get
jest lepsza.W przypadku, gdy masz wiele minimalnych kluczy i chcesz zachować prostotę
źródło
Jeśli nie masz pewności, że nie masz wielu wartości minimalnych, sugeruję:
źródło
Edycja: jest to odpowiedź na pierwotne pytanie OP dotyczące minimalnego klucza, a nie minimalna odpowiedź.
Możesz uzyskać klucze dykta za pomocą
keys
funkcji, i masz rację, używając,min
aby znaleźć minimum tej listy.źródło
Inne podejście do rozwiązania problemu wielu kluczy o tej samej wartości minimalnej:
źródło
Używaj
min
z iteratorem (items
zamiast Pythona 3iteritems
); zamiast lambda użyjitemgetter
operatora from, który jest szybszy niż lambda.źródło
źródło
Porównałem skuteczność następujących trzech opcji:
Przykładowe dane wyjściowe:
źródło
aby utworzyć uporządkowaną klasę, musisz przesłonić 6 funkcji specjalnych, aby została wywołana przez funkcję min ()
metody te są
__lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
w kolejności, w której są mniejsze, mniejsze lub równe, większe niż, większe niż lub równe, równe, nie równe. na przykład powinieneś wdrożyć__lt__
w następujący sposób:możesz użyć funkcji min w następujący sposób:
to działało dla mnie.
źródło
Użyj funkcji zip, aby utworzyć iterator krotek zawierających wartości i klucze. Następnie zawiń go funkcją min, która przyjmuje minimum na podstawie pierwszego klawisza. Zwraca krotkę zawierającą parę (wartość, klucz). Indeks [1] służy do uzyskania odpowiedniego klucza
źródło
źródło
min()
).Czy tego szukasz?
Drukuje „czternaście”
źródło