如何简化数组提取值

时间:2016-04-15 16:32:46

标签: python

是否有一种更简单的方法来解析带有列表的数组:

data = [{'id': '1456', 'type': 'hotel', 'money': '123'}, 
{'id': '3215', 'type': 'appartment', 'rooms': '2', 'toilet': '1'},
{'id': '3213', 'type': 'hotel', 'money': '999'}]

对此:

hotel = ['123, '999']

我想从data数组中提取type酒店的货币价值,并将所有内容附加到一个数组中。

我想避免创建一个循环,然后迭代它,然后检查是否有一个叫{money}的key。如果是这样,请将其解压缩并附加到hotel数组。

对于Python来说似乎有点多余,我猜......

5 个答案:

答案 0 :(得分:3)

是的,您可以使用list comprehension

hotels = [d['money'] for d in data if d['type'] == 'hotel']

这将有效地查看data数组并将每个字典提取为d,如果类型为d['money'],则仅将'hotel'添加到结果数组中。

答案 1 :(得分:1)

使用list comprehension代替

列表推导允许您基于另一个列表构建列表,您可以使用条件仅选择所需的值。

list = [x['money'] for x in data if x['type'] == 'hotel']

答案 2 :(得分:1)

更具功能性的风格就像toolz库。

http://toolz.readthedocs.org/en/latest/api.html#toolz.itertoolz.pluck

列出理解工作,但与LINQ

相比,我发现它们非常难看

答案 3 :(得分:1)

Pandas方法:

In [15]: df = pd.DataFrame(data)

In [16]: df
Out[16]:
     id money rooms toilet        type
0  1456   123   NaN    NaN       hotel
1  3215   NaN     2      1  appartment
2  3213   999   NaN    NaN       hotel

In [17]: df.ix[df.type == 'hotel']
Out[17]:
     id money rooms toilet   type
0  1456   123   NaN    NaN  hotel
2  3213   999   NaN    NaN  hotel

In [18]: df.ix[df.type == 'hotel', 'money']
Out[18]:
0    123
2    999
Name: money, dtype: object

In [19]: df.ix[df.type == 'hotel', 'money'].tolist()
Out[19]: ['123', '999']

一衬垫:

In [20]: pd.DataFrame(data).ix[df.type=='hotel', 'money'].tolist()
Out[20]: ['123', '999']

答案 4 :(得分:1)

功能方法可能类似于:

filter(len, (d.get('money', '') for d in data))

dict.get部分从每个字典中获取money值,如果不存在,则返回空字符串。然后,filter用于删除所有空字符串。