Python 列表理解语法

Python 列表理解语法,python,list-comprehension,Python,List Comprehension,我遇到了一段代码,内容如下: queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]] 这是否等同于: for Xi in csp.vars: for Xk in csp.neighbors[Xi]: queue.append((Xi, Xk)) 或者这是否表示嵌套for语句以外的内容 你说的完全正确。见: 当提供列表理解时,它包括一个表达式,后跟至少一个for子句和零个或多个for或if子句。

我遇到了一段代码,内容如下:

queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
这是否等同于:

for Xi in csp.vars:
    for Xk in csp.neighbors[Xi]:
        queue.append((Xi, Xk))

或者这是否表示嵌套for语句以外的内容

你说的完全正确。见:

当提供列表理解时,它包括一个表达式,后跟至少一个
for
子句和零个或多个
for
if
子句。在这种情况下,新列表的元素是通过将
for
if
子句中的每一个考虑为块,从左到右嵌套,并在每次到达最里面的块时计算表达式以生成列表元素而产生的元素


因此,您对for循环嵌套的解释是正确的。

正如其他人已经指出的,这正是它的含义

我还发现有时在列表/genexp中使用multiple会让人困惑,所以我通常避免使用multiple。当我使用它们时,我通常将每个for放在不同的行中,例如:

queue = [(Xi, Xk) for Xi in csp.vars
                  for Xk in csp.neighbors[Xi]]
甚至缩进:

queue = [(Xi, Xk) for Xi in csp.vars
                      for Xk in csp.neighbors[Xi]]
这就清楚了哪个是内部for循环

此外,列表理解可以为每个for循环使用if表达式,因此完整的语法如下:

queue = [(Xi, Xk) for Xi in csp.vars
                      if condition_one()
                          for Xk in csp.neighbors[Xi]
                              if condition_two()
                                  ... ]

尽管我希望你永远不要写那样的东西。结尾的if表达式很好,但将其与for混合使用会使其过于繁琐,根本不可读。

不,这正是它的本质。你明白了。在我需要开始缩进列表理解的时候,它可能变得太复杂了。在这一点上,为了清晰起见,我会切换到常规代码。你是对的。实际上,我只在有两个
for
s时使用它,或者如果我有一个
for
和一个
if
并且表达式占用了一些空间(因此行太长)。任何比这更复杂的事情最好用“通常的方式”来做。