2017-09-07 11 views
-5

にネストされた辞書の条件によって最初の値を返すことは、ネストされた辞書といくつかの配列がある:パイソン:配列

val = [x['id'] for x in data if x['name'] == 'test'][0]

期待される結果:
data = [{'id':1, 'name':'test'}, {'id':2, 'name':'test'}, ....., {'id':N, 'name':'test'}]

最初idname=test返すようにしようval = 1

例外を除いて:list index out of range
何が問題なのですか?

+0

は=それは '名前の辞書がありませんを意味し、私たちに完全なトレースバック – TerryA

+1

をご提示ください= 'test''をあなたのリストに追加します。 –

+0

次のメソッドを試す –

答えて

1

あなたのコードは、あなたの(少し編集した)サンプルデータを用い私のために正常に動作します:

>>> 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リストが使い果たされるまで繰り返します。プログラム上

+0

ジェネレータの式で 'next'を使うと、潜在的に長いリストを作ることを避けることもできます:' next((x ['id'] for x x ['name'] == 'test'の場合はデータなし)、なし) – niemmi

+0

@niemmi:ありがとう。あなたがコメントしている間、私はそれを私の答えに加えたようです。 – mhawke

0
def getFirstMatchingId(data): 
    val = [x['id'] for x in data if x['name'] == 'test'] 
    if len(val) >= 1: 
     val = val[0] 
     print "Matching ID:-->",val 

data = [{'id':1, 'name':'test'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test'}] 
getFirstMatchingId(data) 

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test1'}] 
getFirstMatchingId(data) 

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test1'}, {'id':3, 'name':'test1'}] 
getFirstMatchingId(data) 

data = [] 
getFirstMatchingId(data) 

出力に

マッチングIDを与える: - > 1 マッチングID: - > 2

関連する問題