列表理解语法

时间:2012-10-19 16:33:13

标签: 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))

或者这是否表示除了嵌套语句之外的其他内容?

2 个答案:

答案 0 :(得分:4)

你完全正确。请参阅list comprehension documentation

  

提供列表推导时,它包含一个表达式,后跟至少一个for子句和零个或多个forif子句。在这种情况下,新列表的元素是通过将每个forif子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。

所以你对for循环嵌套的解释就是现实。

答案 1 :(得分:2)

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

我也发现在list-comprehension / genexp中使用multiple有时会让人感到困惑,所以我通常会避免使用它们。当我使用它们时,我通常将每个用于不同的行,例如:

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循环。

此外,list-comprehension可以为每个for循环都有一个if表达式,所以完整的语法类似于:

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

即使我希望你永远不会写那样的东西。最后的if表达式很好,但是将它与for混合使得太麻烦而且根本不可读。