Skip to main content
 首页 » 编程设计

python之python列表理解中的haskell的 "where"

2025年05月04日15txw1958

如果 lst 是一个整数列表,我想要

[dif for i in range(1, len(lst)) where dif = lst[i]-lst[i-1] if dif < 5] 

但显然,像这样绑定(bind)一个变量在语法上是不正确的(除了 where 是从 Haskell 借来的)。 我能行

[dif for i in range(1, len(lst)) for dif in (lst[i]-lst[i-1],) if dif < 5] 

使 dif 在长度为一的可迭代中运行。另一种选择:

[lst[i]-lst[i-1] for i in range(1, len(lst)) if lst[i]-lst[i-1] < 5] 

此外,我可以定义一个具有差异的中间列表,然后对其进行过滤。但是这两种选择都不是很好。有没有好的单线能得到我想要的?

请您参考如下方法:

我认为这里没有出色的 1-liner。我想既然它是一个列表,你可以使用切片:

[a-b for a, b in zip(lst[1:], lst) if a-b < 5] 

这不是最效率的,因为 lst[1:] 创建了一个副本并且 zip 也具体化了一个新列表(在 python2 。X)。我们可以使用 itertools 做得更好:

from itertools import izip, islice 
[a-b for a, b in izip(islice(lst, 1), lst) if a-b < 5] 

(注意 python3.x 取消了 izip,所以如果您使用 python3,只需使用 zip)。