Python将嵌套循环转换为列表理解

如何解决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.的评论。强烈要求代码具有可读性。

另一方面,您似乎在使用建议的方法覆盖poinh

我猜这将为您提供更通缉的方法:

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)对的单个列表,其中poinh是列表。

在您的问题中不清楚的另一个考虑因素是,您是否要appendextend每个列表。

  • 追加将产生一个列表列表,在某些用例中很有用,在这种情况下,您可以通过构建列表理解来绝对提高性能
  • 如果您仅关心所有元素,而不管其来源是什么,扩展将产生一个平面列表。在这种情况下,如果数据大小适中,那么最好不做任何处理,而避免使用进一步的步骤来分隔元组(请参见下文)

无论如何,这里是列表理解。您可以说它基本上是最里面的代码,然后依次排列所有forif

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并修改其他代码,要么将元组分成两个列表。

如果必须将poinh作为两个单独的列表,则现在需要两个列表理解。

# 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?