Stworzyłem funkcję, która wyszukuje wieki za Dictionary
i pokazuje pasującą nazwę:
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
if age == search_age:
name = dictionary[age]
print name
Wiem, jak porównać i znaleźć wiek, po prostu nie wiem, jak pokazać imię osoby. Ponadto dostaję błąd KeyError
z wiersza 5. Wiem, że to nie jest poprawne, ale nie mogę wymyślić, jak sprawić, by wyszukiwał się wstecz.
python
dictionary
użytkownik998316
źródło
źródło
Odpowiedzi:
Nie ma żadnego.
dict
nie jest przeznaczony do użycia w ten sposób.źródło
Python 3.x
list.items()
zamiastlist.iteritems()
powinny być stosowanedict
Może być dla wielu rzeczy w różnym czasie; Klucze i wartości mają oczywiście jasne znaczenie, ale „dict
przedmioty o określonej wartości” są całkowicie uzasadnionym żądaniem. Zalecenie użycia listy par odrzuciłoby kontekst, że jeden element jest „ definicją ” z drugiego, np. Na listach parametrów ...Lub w Python 3.x:
Zasadniczo oddziela wartości słownika na liście, znajduje pozycję wartości, którą masz, i otrzymuje klucz w tej pozycji.
Więcej informacji
keys()
oraz.values()
w Pythonie 3: Jak mogę uzyskać listę wartości z dict?źródło
list.keys()
ilist.values()
funkcje generują elementy w tej samej kolejności?index
metodzie.Jeśli chcesz zarówno nazwę i wiek, powinieneś użyć tego,
.items()
co daje ci(key, value)
krotki kluczowe :Możesz rozpakować krotkę w dwie osobne zmienne bezpośrednio w
for
pętli, a następnie dopasować wiek.Powinieneś również rozważyć odwrócenie słownika, jeśli na ogół będziesz przeglądać według wieku, a żadna z dwóch osób nie ma tego samego wieku:
dzięki czemu możesz wyszukać nazwę dla wieku, po prostu robiąc
Nazwałem to
mydict
zamiastlist
ponieważlist
jest to nazwa typu wbudowanego i nie powinieneś używać tej nazwy do niczego innego.Możesz nawet uzyskać listę wszystkich osób w danym wieku w jednym wierszu:
lub jeśli w każdym wieku jest tylko jedna osoba:
co ci tylko da
None
jeśli nie ma nikogo w tym wieku.Wreszcie, jeśli
dict
jest długi i używasz Pythona 2, powinieneś rozważyć użycie.iteritems()
zamiast tego,.items()
co zrobił Cat Plus Plus w swojej odpowiedzi, ponieważ nie trzeba tworzyć kopii listy.źródło
dict
listą par.dict
to sens.value --> key
lubkey --> value
Pomyślałem, że byłoby interesujące wskazać, które metody są najszybsze i w jakim scenariuszu:
Oto kilka testów, które przeprowadziłem (na MacBooku Pro 2012)
Wyniki
profile.run()
dla każdej metody 100000 razy:Metoda 1:
Metoda 2:
Metoda 3:
To pokazuje, że w przypadku małego nagrania metoda 1 jest najszybsza. Jest to najbardziej prawdopodobne, ponieważ zwraca pierwsze dopasowanie, w przeciwieństwie do wszystkich dopasowań, takich jak metoda 2 (patrz uwaga poniżej).
Co ciekawe, wykonując te same testy na dykcie, który mam z 2700 wpisami, otrzymuję zupełnie inne wyniki (tym razem uruchamiane 10000 razy):
Metoda 1:
Metoda 2:
Metoda 3:
Więc tutaj metoda 3 jest znacznie szybsza. Po prostu pokazuje, że rozmiar twojego dykta wpłynie na wybraną metodę.
Uwagi: Metoda 2 zwraca listę wszystkich nazw, podczas gdy metody 1 i 3 zwracają tylko pierwsze dopasowanie. Nie rozważałem użycia pamięci. Nie jestem pewien, czy metoda 3 tworzy 2 dodatkowe listy (keys () i wartości ()) i przechowuje je w pamięci.
źródło
.keys()
i`.values()
, które są lekkie.wersja jednoliniowa: (i to stary słownik, p to słownik odwrócony)
objaśnienie:
i.keys()
ii.values()
zwraca dwie listy odpowiednio z kluczami i wartościami słownika. Funkcja zip ma możliwość wiązania list w celu utworzenia słownika.Ostrzeżenie: Działa to tylko wtedy, gdy wartości są haszowalne i unikalne.
źródło
albo lepiej
źródło
źródło
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Wypróbuj ten jeden wiersz, aby odwrócić słownik:
źródło
Uważam, że ta odpowiedź jest dla mnie bardzo skuteczna, ale nie bardzo łatwa do odczytania.
Aby było bardziej jasne, możesz odwrócić klucz i wartość słownika. To sprawia, że klucze wartości i klucze wartości, jak pokazano tutaj .
lub
który jest zasadniczo taki sam jak ten inny odpowiedź .
źródło
Jeśli chcesz znaleźć klucz według wartości, możesz użyć słownika do utworzenia słownika odnośników, a następnie użyć go do znalezienia klucza z wartości.
źródło
Można uzyskać za pomocą przycisku
dict.keys()
,dict.values()
alist.index()
metody, patrz przykłady kodu poniżej:źródło
search_age
var na następnej linii ... Może należy wymienićvalue
zsearch_age
?type(dict_values)
przydatny byłby również wydruk )?Oto moje podejście do tego problemu. :) Właśnie zacząłem uczyć się języka Python, więc nazywam to:
Rozwiązanie „Zrozumiały dla początkujących”.
.
.
źródło
źródło
is
należy stosować wyłącznie do testowania równości singletons (None
,True
,False
itp). Fakt, że CPython ponownie używa literałów łańcuchowych (i dlategoa = 'foobar'; a is 'foobar'
jestTrue
), jest szczegółem implementacyjnym i nie należy na nim polegać.get_key
wyrzuci,StopIteration
jeśli wartość nie istnieje w słowniku - lepiej byłoby użyć tej,next(..., None)
która zwróciłaby się,None
gdyby wartość nie została znaleziona.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Zastanów się nad użyciem Pand. Jak stwierdzono w „Pythonie do analizy danych” Williama McKinneya
Aby wysłać zapytanie do serii, wykonaj następujące czynności:
Co daje:
Jeśli potrzebujesz zrobić coś innego z danymi wyjściowymi, przydatne może być przekształcenie odpowiedzi w listę:
źródło
Tutaj odzyskuje klucz i słownik do znalezienia w słowniku. Następnie zapętlamy klucze w słowniku i porównujemy je z wartością i zwracamy ten konkretny klucz.
źródło
źródło
możemy uzyskać
Key
oddict
przez:źródło
odpowiedziano, ale można to zrobić za pomocą fantazyjnego użycia „mapy / zmniejszenia”, np .:
źródło
Cat Plus Plus wspomniał, że nie tak ma być używany słownik. Dlatego:
Definicja słownika jest analogiczna do definicji mapowania w matematyce. W tym przypadku dykt jest mapowaniem K (zestawu kluczy) na V (wartości) - ale nie odwrotnie. Jeśli wyrejestrujesz dyktando, spodziewasz się zwrócić dokładnie jedną wartość. Jednak mapowanie różnych kluczy na tę samą wartość jest całkowicie legalne, np .:
Kiedy wyszukujesz klucz według odpowiadającej mu wartości, zasadniczo odwracasz słownik. Ale mapowanie niekoniecznie musi być odwracalne! W tym przykładzie zapytanie o klucz odpowiadający v1 może dać k1 lub k3. Powinieneś zwrócić oba? Tylko pierwszy znaleziony? Dlatego indexof () jest niezdefiniowany dla słowników.
Jeśli znasz swoje dane, możesz to zrobić. Ale interfejs API nie może zakładać, że dowolny słownik jest odwracalny, stąd brak takiej operacji.
źródło
oto moje zdanie na ten temat. Jest to dobre do wyświetlania wielu wyników na wypadek, gdybyś ich potrzebował. Więc dodałem również listę
I to wszystko...
źródło
Dane wyjściowe są następujące:
źródło
Nie ma łatwego sposobu na znalezienie klucza na liście poprzez „sprawdzenie” wartości. Jeśli jednak znasz wartość, iterując po kluczach, możesz wyszukać wartości w słowniku według elementu. Jeśli D [element], gdzie D jest obiektem słownikowym, jest równe kluczowi, który próbujesz wyszukać, możesz wykonać kod.
źródło
Musisz użyć słownika i odwrócić ten słownik. Oznacza to, że potrzebujesz innej struktury danych. Jeśli używasz Pythona 3, użyj
enum
modułu, ale jeśli używasz Pythona 2.7, użyj go zenum34
powrotem przeniesionego do Pythona 2.Przykład:
źródło
źródło
Tylko moja odpowiedź w
lambda
ifilter
.źródło
już odpowiedziano, ale ponieważ kilka osób wspomniało o odwróceniu słownika, oto jak to zrobić w jednym wierszu (zakładając odwzorowanie 1: 1) i kilka różnych danych perf:
python 2.6:
2.7+:
jeśli uważasz, że nie jest to 1: 1, nadal możesz utworzyć rozsądne odwrotne mapowanie za pomocą kilku linii:
jak powolne jest to: wolniejsze niż proste wyszukiwanie, ale nie tak wolno, jak mogłoby się wydawać - w „prostym” słowniku 100000, „szybkim” wyszukiwaniu (tj. szukaniu wartości, która powinna znajdować się na początku klawiszy) było około 10 razy szybsze niż odwrócenie całego słownika, a „powolne” wyszukiwanie (pod koniec) około 4–5 razy szybciej. Po co najmniej 10 przeglądach jest to opłacone.
druga wersja (z listami na element) zajmuje około 2,5 razy tyle, co wersja prosta.
Miałem także kilka interesujących wyników z ifilter. Teoretycznie ifilter powinien być szybszy, ponieważ możemy używać itervalues () i być może nie musimy tworzyć / przechodzić przez całą listę wartości. W praktyce wyniki były ... dziwne ...
Tak więc, w przypadku małych odsunięć, był on znacznie szybszy niż jakakolwiek poprzednia wersja (2,36 * u * S w porównaniu z minimum 1,48 * m * S w poprzednich przypadkach). Jednak w przypadku dużych przesunięć pod koniec listy było to znacznie wolniejsze (15,1 ms w porównaniu z tym samym 1,48 ms). Małe oszczędności na niskim poziomie nie są warte kosztu na wysokim poziomie, imho.
źródło
[
w niej brakuje . w przeciwnym razie upewnij się, że jest na dwóch liniach, lub wstaw;
między nimi, jeśli nie jest.Czasami może być potrzebna int ():
źródło
Oto rozwiązanie, które działa zarówno w Python 2, jak i Python 3:
Część do
[search_age]
zbudowania odwrotnego słownika (gdzie wartości są kluczami i odwrotnie). Możesz stworzyć metodę pomocniczą, która buforuje ten odwrócony słownik w następujący sposób:lub nawet bardziej ogólnie fabrykę, która stworzyłaby metodę wyszukiwania nazw według wieku dla jednej lub większej liczby list
więc będziesz mógł zrobić:
Zauważ, że ja przemianowany
list
naages_by_name
od dawna jest predefiniowany typ.źródło
W ten sposób uzyskujesz dostęp do słownika, aby robić to, co chcesz:
oczywiście, wasze imiona są tak nieczułe, że wygląda na to, że drukuje epokę, ale to NIE drukuje imienia. Ponieważ korzystasz z nazwy, staje się bardziej zrozumiałe, jeśli napiszesz:
Jeszcze lepiej:
źródło
W przypadku wielu wystąpień użyj:
źródło
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )