如果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]
此外,我可以定义具有差异的中间列表,然后对其进行过滤。但两种选择都不是很好。有一个很好的单行程来拥有我想要的东西吗?
答案 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]