三个参数过滤

时间:2011-12-01 18:49:20

标签: python

让我们假设我已经定义了函数:

def threeArgs(x,y,z):
  return ... # Returns True or False

我还有一个元素列表:

a = [elem1, elem2, ..., elemN]

我想构建另一个列表b,其中包含第一个和最后一个元素形式列表a以及其间的三个元素Xn(Xn-1,Xn,Xn + 1)返回true。

如何以优雅的pythonic方式做到这一点?

2 个答案:

答案 0 :(得分:1)

使用切片创建三个移位列表,然后将zip组合在一起:

[a[0]] + [y for x, y, z in zip(a, a[1:], a[2:]) if threeArgs(x, y, z)] + [a[-1]]

答案 1 :(得分:0)

如果您定义了window功能,则可以执行以下操作:

a[0] + [a[i+3] for i,v in enumerate(imap(threeArgs, window(a, 3))) if v] + a[-1]

可能会为较大的列表使用较少的内存,因为它完全是迭代器。