【问题标题】:Why when we list all the elements of a list for every list in a list of lists we need a specific order in the for in clauses?为什么当我们为列表列表中的每个列表列出列表的所有元素时,我们需要在 for in 子句中使用特定的顺序?
【发布时间】:2020-04-06 20:15:37
【问题描述】:

我说的是for in 子句的顺序。

此命令有效:

[print(element) for element_list in list_of_lists for element in element_list]

这不是:

[print(element) for element in element_list for element_list in list_of_lists]

我个人觉得第二个更易读。

【问题讨论】:

  • 为什么不会您需要特定的订单?如果任何一个工作都会有歧义。参见例如stackoverflow.com/a/45079294/3001761 进行视觉解释。
  • 是的,顺序在列表理解中很重要。它与等效的 for 循环的顺序相同,因此在这方面是一致的。此外,您不应该在此处使用列表推导。列表推导不适用于副作用,例如 printing。它们用于创建列表
  • 编译器可以使用不同的顺序来进行列表理解和 for 循环吗?

标签: python list syntax


【解决方案1】:

原因很简单。我想我们同意列表是一个有序的集合,所以没有问题。为什么要下单?如果你是这样想的,很容易记住:

(elt for subl in lists for elt in subl)

相同
for subl in lists:
    for elt in subl:
        yield elt

因此,将后者更改为前者所需要做的就是通过删除冒号来“展开”嵌套的 for 循环,已经右缩进的块然后向右滑动并将 yield 表达式放在前面。

如果这很难开始,我建议编写理解,以便您首先编写循环部分,省略冒号和换行符,然后将返回的部分放在最后。也就是说,

1.

for subl in lists
    for elt in subl

2.

[for subl in lists for elt in subl],注意“滑动”到右端

3.

[elt for subl in lists for elt in subl]完成!

【讨论】:

  • 列表理解中的顺序与 for 循环中的顺序不同是否有意义?我发现不正确的方式更具可读性。
  • 可以理解,我一开始也很难。 “错序”感觉更自然,但要看你怎么看;在意识到我解释的规则后,我觉得完全没问题。此外,如果您在 vim 中将 for 循环重构为单行或反之亦然,则当前语法的工作量会减少;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多