【发布时间】:2021-07-25 16:21:34
【问题描述】:
Python 的 list-comprehensions 非常有用,因为它们允许我们将常见的模式写入简单、简洁、易读的单行代码中:
| loop with filter | loop with break |
|---|---|
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> g(x): l.append(f(x)) |
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> <b>not</b> g(x): <b>break</b> l.append(f(x)) |
[f(x) <b>for</b> x <b>in</b> xs <b>if</b> g(x)] |
[f(x) <b>for</b> x <b>in</b> takewhile(g, x)] |
考虑允许过滤器/中断依赖于所有先前生成的元素的稍微更一般的模式:
| loop with history-dependent filter | loop with history-dependent break |
|---|---|
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> g(x, l): l.append(f(x)) |
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> <b>not</b> g(x, l): <b>break</b> l.append(f(x)) |
问题:是否有可能将这些模式也转化为列表理解?
对我来说,答案似乎是否定的 / 它仅适用于 g 的非常特殊情况(如 [1]),因为其中一个需要能够在创建列表时引用它。
问题结束 // 有些语无伦次:
似乎需要一种全新的语法
[f(x) <b>for</b> x <b>in</b> xs <b>if</b> g(x, <b>this</b>)]
其中<b>this</b> 是一个新关键字的符号占位符,可以从上下文中引用外部对象。我不知道这在原则上是否可行,但能写出来会很酷
| loop with history-dependent filter | loop with history-dependent break |
|---|---|
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> g(x, l): l.append(f(x)) |
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> <b>not</b> g(x, l): <b>break</b> l.append(f(x)) |
[f(x) <b>for</b> x <b>in</b> xs <b>if</b> g(x, <b>this</b>)] |
[f(x) <b>for</b> x <b>in</b> xs <b>while</b> g(x, <b>this</b>)] |
或者更一般的
| loop with history-dependent filter and yield | loop with history-dependent break and yield |
|---|---|
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> g(x, l): l.append(f(x, l)) |
l = [] <b>for</b> x <b>in</b> xs: <b>if</b> <b>not</b> g(x, l): <b>break</b> l.append(f(x, l)) |
[f(x, <b>this</b>) <b>for</b> x <b>in</b> xs <b>if</b> g(x, <b>this</b>)] |
[f(x, <b>this</b>) <b>for</b> x <b>in</b> xs <b>while</b> g(x, <b>this</b>)] |
允许列表推导的下一个元素和退出条件依赖于所有先前生成的元素。在set-builder notation 中,这两个构造将转换为
S⁽ⁿ⁺¹⁾ = { f(xₖ, S⁽ᵏ⁾) ∣ xₖ∈{x₁,…,xₙ} ∧ g(xₖ, S⁽ᵏ⁾) }
= S⁽ⁿ⁾ ∪ {f(xₙ, S⁽ⁿ⁾) ∣ g(xₙ, S⁽ⁿ⁾)}
和
S⁽ⁿ⁺¹⁾ = { f(xₖ, S⁽ᵏ⁾) ∣ xₖ∈{x₁,…,xₙ} ∧ ∀l≤k g(xₗ, S⁽ˡ⁾) }
= S⁽ⁿ⁾ ∪ {f(xₙ, S⁽ⁿ⁾) ∣ ∀k≤n g(xₖ, S⁽ᵏ⁾)}
是否有任何语言具有这样的功能?
【问题讨论】:
-
@AlexWaygood 问题中提出的
this的语义没有基本障碍 - 被理解的列表确实在执行理解时存在,因为最终是一个列表理解是通过创建一个空列表,运行一个循环(可能检查条件并)计算附加到列表中的一些结果,然后返回列表来执行的。因此,在检查条件并计算结果时,列表确实存在,并且语言允许条件和/或结果访问对它的引用并非不可能。 -
谢谢!我不知道理解是如何实现的。原谅我的无知。我仍然认为在 Python 中实现是不可能的(而且可能是不可取的?)(我知道这是不同的一点)。对我的口味来说有点太神奇了。
-
@kaya3 你也可以尝试实际find the list并使用它。