あなたのコードは、あなたの(少し編集した)サンプルデータを用い私のために正常に動作します:
>>> 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
この:対象の文字列に一致する名前を含む一切の辞書が存在しない場合は、しかし、
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
をd['name']
という辞書が'blah'
に設定されているため、リストの解説は空のリストを作成するためです。空のリストのインデックスを作成すると、IndexError
例外が発生します。それは、これを行うのと同じです:
>>> [][0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
この問題を解決する簡単な方法は、それをインデックス化する前に、リストをチェックすることです:
matches = [x['id'] for x in data if x['name'] == 'test']
val = matches[0] if matches else None
ここではNone
として使用することができないと仮定されますid
の値。これは、マッチした辞書を含む全リストを生成回避ジェネレータ式を使用しています
val = next((x['id'] for x in data if x['name'] == 'test'), None)
:再びNone
が有効id
ではないと仮定し
別
、より効率的な方法は、デフォルト値で
next()
を使用することです。代わりに、
data
のリストを最初の一致が見つかるまで、または
data
リストが使い果たされるまで繰り返します。プログラム上
は=それは '名前の辞書がありませんを意味し、私たちに完全なトレースバック – TerryA
をご提示ください= 'test''をあなたのリストに追加します。 –
次のメソッドを試す –