2013-11-04 50 views
0

選擇項目由於數據結構如下:從Python字典

data = {'NameValues':[ 
      {'Name':'Field 1', 'Values':['Data 1']}, 
      {'Name':'Field 2', 'Values':['Data 2']}, 
      {'Name':'Field 3', 'Values':['Data 3']}, 
      {'Name':'Field 4', 'Values':['Data 4']}, 
      {'Name':'Field 5', 'Values':['Data 5']} 
      ]} 

如何通過名稱查找,並得到一個元素的值?例如直至匹配元件被發現通過NameValues陣列

p hash['NameValues'].find{ |h| h['Name'] == 'Field 3'}['Values'] 
#=> ["Data 3"] 

此迭代:得到的值字段3.

在Ruby我會使用這一點。然後我可以從返回的元素中獲取值。

問候

+2

'[V [ '值']爲V IN數據[ 'NameValues'】V [ '名稱'] ==「場3']' –

+0

+1以上的評論,但有沒有任何理由結構是這樣的,而不是{「NameValues」:{「Field 1」:[「Data 1」],「Field 2」:[ 「數據2」] ...}? –

+0

@PedroWerneck猜測是,這是某種類型的json。 –

回答

1
for i in data['NameValues']: 
    if i['name'] == 'Field 3': 
     value = i['values'] 
# use value here 

我在雖然使用Python一個完整的新手,有人可能會給出更好的答案。

+1

+ +1爲一個明顯的,簡單的答案。好一個。 –

4

爲了您的迭代要求,發電機是比較合適的:

>>> data = {'NameValues':[ 
...   {'Name':'Field 1', 'Values':['Data 1']}, 
...   {'Name':'Field 2', 'Values':['Data 2']}, 
...   {'Name':'Field 3', 'Values':['Data 3']}, 
...   {'Name':'Field 4', 'Values':['Data 4']}, 
...   {'Name':'Field 5', 'Values':['Data 5']} 
...   ]} 
>>> i = (v['Values'] for v in data['NameValues'] if v['Name'] == 'Field 3') 
>>> next(i) 
['Data 3'] 

你會得到一個StopIteration異常時,有沒有符合您的條件,更多的元素。

+0

你能否詳細說說在這裏使用發生器?這顯然是一個很好的解決方案,但是對於未來的讀者來說,添加一些解釋會更有價值 – lejlot

+0

與列表理解不同,生成器僅在消耗時執行;所以假設數據是一個大集合,列表理解會在內存列表中創建一個大的列表。在這種特定情況下,列表理解也會產生不必要的外部(封閉)列表。 –

+0

嗯,我知道這一點,我只是建議將它添加到您的答案以供將來參考 – lejlot

0

您可以通過

l = [ e(v) for v in C if f(v) ] 

其中e一些提取功能創建符合條件的f在某些容器C所有值的列表。

在您的特定情況下,你可以使用C:=data'NameValues'e(v):=v['values']f(v):=v['Name']=='Field 3'

l = [ v['Values'] for v in data['NameValues'] if v['Name'] == 'Field 3' ] 
print l 

,如果你只在第一次出現有關

l = [ v['Values'] for v in data['NameValues'] if v['Name'] == 'Field 3' ][0] 
print l 
1

您可以使用similer語法:

p hash['NameValues'].find{ |h| h['Name'] == 'Field 3'}['Values'] 
#=> ["Data 3"] 

filter

>>> data = {'NameValues':[ 
...   {'Name':'Field 1', 'Values':['Data 1']}, 
...   {'Name':'Field 2', 'Values':['Data 2']}, 
...   {'Name':'Field 3', 'Values':['Data 3']}, 
...   {'Name':'Field 4', 'Values':['Data 4']}, 
...   {'Name':'Field 5', 'Values':['Data 5']} 
...   ]} 
>>> 
>>> filter(lambda h: h['Name'] == 'Field 3', data['NameValues'])[0]['Values'] 
['Data 3'] 
>>> 

,或者如果你使用Python 3:如果

>>> list(filter(lambda h: h['Name'] == 'Field 3', data['NameValues']))[0]['Values'] 
+0

是否有價值是否有任何原因downvote? – 2013-11-04 10:09:25

+1

不確定,因爲我不是Python的經驗豐富,但是當我在Python 3.3.2中運行代碼時,出現以下錯誤:'TypeError:'filter'object is not subscriptable'。 –

+0

@ Qantas94Heavy感謝您的重播,它看起來在2和3之間有'filter'返回類型。 – 2013-11-04 11:18:46