【问题标题】:How to read aloud Python List Comprehensions?如何大声朗读 Python 列表理解?
【发布时间】:2012-01-30 09:30:23
【问题描述】:

我的问题是关于 Python List Comprehension 的可读性。当我遇到具有复杂/嵌套列表理解的代码时,我发现我必须重新阅读它们几次才能理解其意图。

是否有一种直观的方式来大声朗读列表理解?似乎我应该从中间开始“阅读”,然后阅读 if 条件(如果有),然后阅读 表达式 最后。

为了理解它,我将如何大声阅读以下代码行:

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

“对于列表 x 中的每个元素,以及列表 y 中的每个元素,如果两个元素不相同创建一个元组列表。”

我正在努力解决的两个例子: 您将如何大声朗读以下列表理解?

  1. 来自 Stack Overflow 中的另一个问题:[x for b in a for x in b]

  2. Python 文档有这个例子: [[row[i] for row in matrix] for i in range(4)]

非常感谢任何关于朗读列表理解的方法的建议或指示,以使意图变得更清晰。

【问题讨论】:

  • 不要大声朗读编程代码,这通常会造成混淆而不是澄清
  • @LieRyan 我的问题实际上是关于可读性和理解其他人的代码。我写了“大声朗读”,因为我不知道如何表达它。
  • 可读性并不意味着大声朗读;我通常会尝试对理解的循环形式进行分类。嵌套推导共有三种通用方式,[... for ... in A for ... in B] 模式形成笛卡尔积[... for ... in [... for ... in A]] 形成一个管道(如在壳管中); [[... for ... in A] for ... in B] 创建一个多维数组。在对循环的一般形式进行分类之后,解释表达式和 if 条件部分就变得微不足道了。
  • 由于list comprehension 遵循数学集合构建符号,因此在更简单的情况下,使用此符号本身来掌握它可能会有所帮助:S = {(x, y) : x ∈ {1,2,3} and y ∈ {3,1,4}, x != y}。不过,在更复杂的示例中,它并不是很有帮助。

标签: python list-comprehension


【解决方案1】:

我通常会在脑海中展开成一个生成循环,例如

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

是生成器的列表推导

for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            yield (x, y)

示例 #1

[x for b in a for x in b] 是理解

for b in a:
    for x in b:
        yield x

a = [[1,2,3],[4,5,6]] 的示例结果:[1, 2, 3, 4, 5, 6]


示例 #2

[[row[i] for row in matrix] for i in range(4)](注意内部表达式是另一种理解!):

for i in range(4):
    yield [row[i] for row in matrix]

展开

for i in range(4):
    l = []

    for row in matrix:
        l.append(row[i])

    yield l

【讨论】:

  • 谢谢@AndiDog。你能帮我展开另外两个吗?那些是让我绊倒的人。
  • @Ram: 好了,希望这对你有意义。
  • 是的——这种考虑多部分推导的方式应该是到处解释列表推导的方式。 PEP 做到了,但大多数程序员不阅读 PEP。当我得知[x for b in a for x in b] 嵌套在它的方向而不是另一个方向时,我感到非常震惊!但是,如果我一开始就了解@AndiDog 上面列出的内容,我就不会遇到这个问题。
  • 对于初学者,我认为将这些列表推导式呈现为好像它们是使用内部生成器实现的一样具有误导性。正确的实现可以在 python 文档中看到,here
【解决方案2】:

“根据 Q 为真的 Y 和 Z,构造一个 X 列表。”

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2022-01-14
    • 1970-01-01
    • 2021-11-11
    • 2014-05-03
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多