2015-08-28 95 views
1

我有一個列表形式的數據,有一些鍵和值(下面的例子是兩個鍵/值,可能會有更多):如何基於來自同一元素的另一個值在dict列表中搜索元素的值?

我想pythonically回答這個問題:什麼是johnage

我現在使用的簡單解決方案是遍歷列表並檢查名稱的匹配值。是否有更多pythonic方式來實現相同?

data = [ 
    { 
     'name': 'john', 
     'age': 10 
    }, 
    { 
     'name': 'paul', 
     'age': 20 
    } 
] 

age = -1 # in case the name is not found 
for d in data: 
    if d['name'] == 'john': 
     age = d['age'] 

print(age) 
+1

否;除非你可以重新安排一個字典'{'john':10,...}'(然後它只是'age = d.get('john',-1)'),就像你可以得到它一樣簡單。不過,'break'會改善運行時間。 – jonrsharpe

+0

可能的重複http://stackoverflow.com/questions/8534256/find-first-element-in-a-sequence-that-matches-a-predicate –

回答

1

我會用next()和一個生成器表達式。

生成器表達式將等於您的for循環的一行,並且next()將從它獲得下一個值(當第一次調用時是第一個值)。

實施例 -

next((d['age'] for d in data if d['name'].lower() == 'john'), -1) 

的第二個參數-1是像的默認值的情況下,返回發生器表達式不具有在這種情況下不再值( - john不存在 - 如果name它意味着在列表中)。


演示 -

>>> data = [ 
...  { 
...   'name': 'john', 
...   'age': 10 
...  }, 
...  { 
...   'name': 'paul', 
...   'age': 20 
...  } 
... ] 
>>> 
>>> next((d['age'] for d in data if d['name'].lower() == 'john'), None) 
10 
0

您可以創建一個名爲關鍵和年齡作爲值的字典,然後查找名稱:

age = {person['name']: person['age'] 
     for person in data}['john'] 
0

也許你想要的是一個清單理解

此外,您還可以在列表中使用過濾器是這樣的:

age = filter(lambda u : u['name'] == 'john', data)[0]['age'] 
0

如果你需要做這個查詢多個名稱,這將是明智的生成與名稱的字典作爲重點 -

new_dict = {datum['name']: data for datum in data} 

new_dict['john']['age'] 

這樣你可以很容易地訪問它,似乎更pythonic。儘管如此,如果你的數據集太大而不能成爲問題,它可能不是性能優化解決方案。

相關問題