[英]Python nested for loops using list comprehension
for module in host.modules:
for removal in removal_re:
compile_re = re.compile(removal)
if compile_re.match(module.name):
removed_modules.append(module)
continue
我怎样才能使用列表理解来完成上述操作? 我已经尝试过在list comp上进行很多研究,但由于某种原因似乎无法理解它。 有什么想法/建议吗?
如果任何正则表达式匹配,您可以使用any
将module
添加到列表中而不进行全部评估。 此外,如果您只使用一次正则表达式, re.compile
并没有真正帮助:
removed_modules = [module for module in host.modules
if any(re.match(removal, module.name) for removal in removal_re)]
(注意:我假设你的意思是break
而不是continue
,它在你的代码中什么都不做,如果匹配多个正则表达式,会导致module
被多次添加到列表中。)
此外,尽管有什么其他的答案说(其中一些似乎误解了什么环路是做),我觉得在这种情况下,列表理解比环更具可读性和清晰。
通常,您可以使用以下方案以某种方式将循环转换为列表推导:
new_list = []
for element in old_list:
if condition:
new_element = func(element)
new_list.append(new_element)
做同样的伎俩:
new_list = [func(element) for element in old_list if condition]
func
可以是改变原始列表元素的任何东西。 也许这有助于您了解列表理解。
你的代码比列表理解更具可读性,但让我们来看看它
典型的语法是这样的
[expression(item) for item in list if condition]
这将返回一个列表,如果你没有将列表comp分配给一个变量,那么它只会对len(list)
中的项目执行一次len(list)
次。 if
语句是可选的。 知道这个让我们改变你的代码一点点,你可以看到困难的部分是完成内循环,所以让我们先做
for module in host.modules:
removed_modules = [module for removal in removal_re if re.compile(removal).match(module.name)]
好吧,所以它已经不是pep 8兼容,因为它太长了但是为了参数你可以看到我们制作了一个已删除模块的列表,我们循环遍历host.modules
的模块host.modules
执行此操作。
这意味着在这个新的for loop
可以成为我们之前谈到的表达式,模块可以成为项目,我们最终得到这个
[[module for removal in removal_re if re.compile(removal).match(module.name)] for module in host.modules]
嘿presto一个班轮,但只记得,只是因为你可以做某事并不意味着你应该!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.