Python:处理两个列表的"Pythonic"方法是什么?

Mar*_*tit 3 python list-comprehension list

说我在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
Run Code Online (Sandbox Code Playgroud)

有什么更Pythonic的方法来处理这个问题?我认为列表理解可以做得很好,但我无法理解这个"过程两个单独的列表"的一部分.

aba*_*ert 8

要将两个嵌套循环转换为嵌套理解,您只需执行以下操作:

[<expression> for x in list1 for y in list2]
Run Code Online (Sandbox Code Playgroud)

如果您从未考虑过列表推导如何工作,那么教程会解释它:

列表推导由括号组成,括号中包含一个表达式,后跟一个for子句,然后是零个或多个for或if子句.结果将是一个新列表,该列表是通过在其后面的for和if子句的上下文中计算表达式得到的.

换句话说,理解中从左到右的条款与从顶部/外部到底部/内部的陈述相匹配,这就是它的全部内容.

这篇博客文章尝试以另一种方式提出相同的想法,以防你尚未获得它.


但是在这里,你没有表达,你有一个声明.

但是你在那里有一个表达式,y in x声明的一部分,你想要做的是返回True,如果它对任何值都是真的,那正是这样any做的.所以:

return any([y in x for x in list1 for y in list2])
Run Code Online (Sandbox Code Playgroud)

实际上,您不希望在此处构建列表,只是迭代值,因此删除方括号以使其成为生成器表达式:

return any(y in x for x in list1 for y in list2)
Run Code Online (Sandbox Code Playgroud)

对于只迭代多个迭代的笛卡尔积的简单情况,您可能想要使用itertools.product.在这种情况下,我不认为它使事情再简单不过或更具可读性,但如果你有四个列表,而不是两个或不可预测的,在提前数他们,这可能是一个不同的故事:

return any(y in x for x, y in product(list1, list2))
Run Code Online (Sandbox Code Playgroud)