假设我在Python中有这段代码。如您所知,我是Perl程序员。
# Both list1 and list2 are a list of strings
for x in list1:
for y in list2:
if y in x:
return True
return False
有什么更Python化的方式来处理此问题?我认为列表理解可以很好地解决这个问题,但是我无法理解“处理两个单独的列表”这一部分。
要将两个嵌套循环转换为嵌套理解,只需执行以下操作:
[<expression> for x in list1 for y in list2]
如果您从未考虑过列表推导的工作原理,那么本教程将对它进行解释:
列表推导由包含表达式的方括号组成,后跟一个for子句,然后是零个或多个for或if子句。结果将是一个新列表,该列表是通过在其后的for和if子句的上下文中评估表达式而得出的。
换句话说,理解中从左到右的子句与从上/外到下/内的语句匹配,仅此而已。
这篇博客文章试图以另一种方式提出相同的想法,以防万一您还没有想到。
但是在这里,您没有表达式,有声明。
但是,您在其中有一个表达式,y in x
语句的一部分,并且如果要对任何值都设置为真,则要返回True any
。所以:
return any([y in x for x in list1 for y in list2])
实际上,您不想在此处构建列表,而只是遍历值,因此请放方括号以使其成为生成器表达式:
return any(y in x for x in list1 for y in list2)
对于仅迭代多个可迭代对象的笛卡尔乘积的简单情况,您可能需要使用itertools.product
。在这种情况下,我认为这不会使事情变得更简单或更具可读性,但是如果您有四个列表而不是两个列表(或者它们的数量是不可预测的),那么情况可能会不同:
return any(y in x for x, y in product(list1, list2))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句