haskell的“where”在python列表中的理解

时间:2014-10-31 19:49:31

标签: python

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

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

但显然,绑定这样的变量在语法上并不正确(除了从{Haskell借用where这一事实)。 我能做到

[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]

此外,我可以定义具有差异的中间列表,然后对其进行过滤。但两种选择都不是很好。有一个很好的单行程来拥有我想要的东西吗?

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

你可以使用嵌套理解和生成器来提高效率:

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