从python词典中选择项目

时间:2013-11-04 09:58:00

标签: python dictionary

鉴于以下数据结构:

   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数组,直到找到匹配的元素。然后我可以从返回的元素中获取值。

此致

4 个答案:

答案 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"]

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']

答案 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