Załóżmy, że mam to:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
i wyszukując „Pam” jako nazwę, chcę pobrać powiązany słownik: {name: "Pam", age: 7}
Jak to osiągnąć?
python
search
dictionary
Hellnar
źródło
źródło
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
do wygenerowania systemem indeksu:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.To wydaje mi się najbardziej pytonicznym sposobem:
wynik (zwrócony jako lista w Pythonie 2):
Uwaga: W Pythonie 3 zwracany jest obiekt filtru. Tak więc rozwiązaniem python3 byłoby:
źródło
len()
, musisz najpierw wywołaćlist()
wynik. Lub: stackoverflow.com/questions/19182188/…r
jestlist
next(filter(lambda x: x['name'] == 'Pam', dicts))
@ Frédéric Hamidi odpowiedź jest świetna. W Pythonie 3.x
.next()
zmieniono nieco składnię . Zatem niewielka modyfikacja:Jak wspomniano w komentarzach @Matt, możesz dodać wartość domyślną jako taką:
źródło
Możesz użyć rozumienia listy :
źródło
źródło
def search(list, key, value): for item in list: if item[key] == value: return item
Przetestowałem różne metody przeglądania listy słowników i zwracania słowników, w których klucz x ma określoną wartość.
Wyniki:
Wszystkie testy wykonane w Pythonie 3.6 .4, W7x64.
Wyniki:
źródło
Aby dodać tylko odrobinę do @ FrédéricHamidi.
Jeśli nie masz pewności, czy klucz znajduje się na liście nagrań, coś takiego pomoże:
źródło
item.get("name") == "Pam"
Czy kiedykolwiek wypróbowałeś pakiet pand? Jest idealny do tego rodzaju zadań wyszukiwania i zoptymalizowany.
Poniżej dodałem trochę testów porównawczych, aby zilustrować szybsze czasy działania pand na większą skalę, tj. Ponad 100 000 wpisów:
źródło
Jest to ogólny sposób wyszukiwania wartości na liście słowników:
źródło
To jest jeden sposób ...
źródło
Po prostu używając rozumienia listy:
Przykładowy kod:
źródło
Możesz to osiągnąć za pomocą filtru i następnych metod w Pythonie.
filter
Metoda filtruje podaną sekwencję i zwraca iterator.next
Metoda akceptuje iterator i zwraca następny element na liście.Aby znaleźć element,
a wynikiem jest
Uwaga: powyższy kod zwróci
None
incase, jeśli szukana nazwa nie zostanie znaleziona.źródło
Najpierw pomyślałem, że możesz rozważyć utworzenie słownika tych słowników ... jeśli, na przykład, będziesz go przeszukiwał więcej niż kilka razy.
Może to być jednak przedwczesna optymalizacja. Co byłoby nie tak z:
źródło
źródło
Jednym prostym sposobem korzystania ze zrozumień listy jest, jeśli
l
lista jestnastępnie
źródło
Możesz spróbować:
źródło
Oto porównanie za pomocą iteracji listy, za pomocą filtru + lambda lub refaktoryzacji (jeśli jest to konieczne lub ważne w przypadku) kodu do dyktowania, a nie listy dykt
A wynik jest następujący:
Wniosek: Najwyraźniej posiadanie słownika słowników jest najskuteczniejszym sposobem wyszukiwania w tych przypadkach, w których wiesz, że będziesz wyszukiwał tylko według identyfikatora. co ciekawe, użycie filtru jest najwolniejszym rozwiązaniem.
źródło
Musisz przejść przez wszystkie elementy listy. Nie ma skrótu!
Chyba że gdzieś indziej prowadzisz słownik nazw wskazujący na elementy listy, ale musisz zadbać o konsekwencje wyskakiwania elementu z listy.
źródło
Znalazłem ten wątek, gdy szukałem odpowiedzi na to samo pytanie. Chociaż zdaję sobie sprawę, że jest to późna odpowiedź, pomyślałem, że wrócę na wypadek, gdyby była przydatna dla kogoś innego:
źródło
Większość (jeśli nie wszystkie) implementacje tutaj zaproponowane mają dwie wady:
Zaktualizowana propozycja:
Może nie najbardziej pythoniczny, ale przynajmniej nieco bardziej bezpieczny w razie awarii.
Stosowanie:
Sens .
źródło