Odpowiedź oferowana przez @faham jest ładną linijką, ale nie zwraca indeksu do słownika zawierającego wartość. Zamiast tego zwraca sam słownik. Oto prosty sposób, aby uzyskać: Listę indeksów, jeden lub więcej, jeśli jest więcej niż jeden, lub pustą listę, jeśli nie ma:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
[i for i, d in enumerate(list) if 'Tom' in d.values()]
Wynik:
>>> [1]
W tym podejściu podoba mi się to, że dzięki prostej edycji można uzyskać listę zarówno indeksów, jak i słowników jako krotki. To jest problem, który musiałem rozwiązać i znalazłem te odpowiedzi. Poniżej dodałem zduplikowaną wartość w innym słowniku, aby pokazać, jak to działa:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'},
{'id':'4567','name':'Tom'}]
[(i, d) for i, d in enumerate(list) if 'Tom' in d.values()]
Wynik:
>>> [(1, {'id': '2345', 'name': 'Tom'}), (3, {'id': '4567', 'name': 'Tom'})]
To rozwiązanie znajduje wszystkie słowniki zawierające słowo „Tom” w dowolnej z ich wartości.