如何解决Python将嵌套循环转换为列表理解
我有多层次的字典清单,我需要从中列出两个必要的清单。目前,我可以通过这种方式进行此操作,但想采用完全列表理解的方式,
poi = []
nh = []
tr_poi_nh = response.xpath('string(//body)').re(r'window\.__WEB_CONTEXT__=(.*?);\(this')[0]
tr_poi_nh = json.loads(tr_poi_nh.replace("pageManifest",'"pageManifest"'))
for entry in tr_poi_nh['pageManifest']['hydrations']:
if entry['package'] == 'e374ol':
for value in entry['props']['initialAvailableFilters']:
if value['paramName'] =='distFrom':
poi = [x['normalized_name'] for x in value['poiSet']]
if value['paramName'] == 'zfn':
nh = [y['label'] for y in value['choices']]
print(poi,nh)
解决方法
我同意g.d.c.的评论。强烈要求代码具有可读性。
另一方面,您似乎在使用建议的方法覆盖poi
和nh
。
我猜这将为您提供更通缉的方法:
poi = []
nh = []
tr_poi_nh = response.xpath('string(//body)').re(r'window\.__WEB_CONTEXT__=(.*?);\(this')[0]
tr_poi_nh = json.loads(tr_poi_nh.replace("pageManifest",'"pageManifest"'))
for entry in tr_poi_nh['pageManifest']['hydrations']:
if entry['package'] == 'e374ol':
for value in entry['props']['initialAvailableFilters']:
if value['paramName'] =='distFrom':
poi.extend([x['normalized_name'] for x in value['poiSet']])
if value['paramName'] == 'zfn':
nh.extend([y['label'] for y in value['choices']])
print(poi,nh)
通过使用扩展,您会将所有值添加到原始列表中,而不是覆盖整个列表。
,正如g.d.d.c所提到的,列表理解并非总是有利的。在这种情况下,它将具有更好的性能,因为您将避免每次迭代都调用append
,如this answer所述。如果您充分利用缩进,您仍然可以轻松理解列表理解。
唯一的问题是,您不能从列表理解中返回两个不同的列表,最接近的方法是返回具有(poi,nh)
对的单个列表,其中poi
和nh
是列表。
在您的问题中不清楚的另一个考虑因素是,您是否要append
或extend
每个列表。
- 追加将产生一个列表列表,在某些用例中很有用,在这种情况下,您可以通过构建列表理解来绝对提高性能。
- 如果您仅关心所有元素,而不管其来源是什么,扩展将产生一个平面列表。在这种情况下,如果数据大小适中,那么最好不做任何处理,而避免使用进一步的步骤来分隔元组(请参见下文)
无论如何,这里是列表理解。您可以说它基本上是最里面的代码,然后依次排列所有for
和if
。
main_list = [
(
[x['normalized_name'] for x in value['poiSet']]
if value['paramName'] == 'distFrom' else [],[y['label'] for y in value['choices']]
if value['paramName'] == 'znf' else []
)
for entry in tr_poi_nh['pageManifest']['hydrations']
if entry['package'] == 'e374ol'
for value in entry['props']['initialAvailableFilters']
]
我会考虑从这里最简单的方法,要么直接使用main_list
并修改其他代码,要么将元组分成两个列表。
如果必须将poi
和nh
作为两个单独的列表,则现在需要两个列表理解。
# to have lists of lists
poi = [x[0] for x in main_list]
nh = [x[1] for x in main_list]
# OR
# to have flat lists
poi = [e for x in main_list for e in x[0]]
nh = [e for x in main_list for e in x[1]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。