Python 如何简化数组提取值

Python 如何简化数组提取值,python,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'] 我想从数据数组中提取类型hotel的货

是否有一种更简单的方法可以从以下位置解析包含列表的数组:

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

hotel = ['123, '999']
我想从数据数组中提取类型hotel的货币值,并将所有内容附加到一个数组中

我希望避免创建一个循环,并对其进行迭代,然后检查是否有一个名为money的键。如果是这样,则将其提取并附加到一个hotel数组中

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

是的,您可以使用:

这将有效地查看数据数组,并将每个字典提取为d,然后如果类型为“hotel”,则只将d['money']添加到结果数组中

是的,你可以使用:

这将有效地查看数据数组,并将每个字典提取为d,然后如果类型为“hotel”,则只将d['money']添加到结果数组中

使用它

列表理解允许您基于另一个列表构建列表,并且您可以使用条件仅选择所需的值

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

列表理解允许您基于另一个列表构建列表,并且您可以使用条件仅选择所需的值

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

更具功能性的样式类似于toolz库


列表理解工作也是如此,但我发现它们非常难看,与LINQ之类的东西相比,更实用的样式应该是toolz库之类的东西

列出理解工作,但我发现它们与LINQ方法相比非常难看:

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']
方法:

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

功能性方法可能类似于:

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

get部分从每个字典中获取货币值,如果不存在,则返回空字符串。然后,使用筛选器删除所有空字符串。

函数方法可能类似于:

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

get部分从每个字典中获取货币值,如果不存在,则返回空字符串。然后,使用过滤器删除所有空字符串。

您确实意识到LINQ和列表理解基本上是一样的,对吗?事实上,这是搜索C列表理解的第一个结果。@AlexVanLiew它们做了一些类似的事情,但它们不一样。如果必须执行嵌套查询,LINQ更简洁,效果更好。在LINQ中,分组等流程更为自然。您确实意识到LINQ和列表理解基本上是一样的,对吗?事实上,这是搜索C列表理解的第一个结果。@AlexVanLiew它们做了一些类似的事情,但它们不一样。如果必须执行嵌套查询,LINQ更简洁,效果更好。此外,分组等流程在LINQ中更自然