鉴于以下数据结构:
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']}
]}
如何通过名称查找并获取元素的值?例如获取Field 3的值。
在Ruby中我会用这个:
p hash['NameValues'].find{ |h| h['Name'] == 'Field 3'}['Values']
#=> ["Data 3"]
这将遍历NameValues数组,直到找到匹配的元素。然后我可以从返回的元素中获取值。
此致
答案 0 :(得分: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
例外。
答案 1 :(得分:1)
for i in data['NameValues']:
if i['name'] == 'Field 3':
value = i['values']
# use value here
我是一个使用Python的新手,有人可能会给出更好的答案。
答案 2 :(得分:1)
您可以使用similer语法:
p hash['NameValues'].find{ |h| h['Name'] == 'Field 3'}['Values']
#=> ["Data 3"]
>>> 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']
答案 3 :(得分:0)
您可以通过
在某个容器f
中创建符合条件C
的所有值的列表
l = [ e(v) for v in C if f(v) ]
其中e
是一些提取函数。
在您的特定情况下,您可以使用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