Ihr Code funktioniert gut für mich Ihre (leicht bearbeitet) Beispieldaten:
data = [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}]
val = [x['id'] for x in data if x['name'] == 'test'][0]
>>> print(val)
1
Wenn es jedoch kein Wörterbuch ist einen Namen enthält, der die Zielzeichenfolge entspricht:
>>> val = [x['id'] for x in data if x['name'] == 'blah'][0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Diese liegt daran, dass das Listenverständnis eine leere Liste erzeugt, da keine Wörterbücher mit d['name']
auf 'blah'
gesetzt sind. Das Indizieren einer leeren Liste führt zur Ausnahme IndexError
. Es ist das gleiche, wie dies zu tun:
>>> [][0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Ein einfacher Weg, um dieses Problem beheben, die Liste zu überprüfen, bevor es die Indizierung:
matches = [x['id'] for x in data if x['name'] == 'test']
val = matches[0] if matches else None
hier wird angenommen, dass None
nicht als verwendet werden der Wert für eine id
.
Eine andere, effizientere Art und Weise, wieder unter der Annahme, dass None
keine gültige id
ist next()
mit einem Standardwert zu verwenden:
val = next((x['id'] for x in data if x['name'] == 'test'), None)
Dieser einen Generator Ausdruck verwendet, der eine ganze Liste vermeidet die Erzeugung der angepassten Wörterbücher enthalten . Stattdessen wird nur über die Liste data
iteriert, bis die erste Übereinstimmung gefunden wurde oder die data
Liste erschöpft ist.
Bitte zeigen Sie uns die vollständige Zurückverfolgungs – TerryA
Es bedeutet, es gibt keine dict mit 'name = = "Test" in deiner Liste –
Nächste Methode versuchen –