是否存在循环的pythonic方式并使用之前的项目

时间:2014-05-10 14:12:49

标签: python

例如,我有一个数组X [1,3,2,5,1,3],我需要一个像移动窗口一样的新数组,找到每3个项目中最小的数组==> [1,1,1,2,1,1]

我知道我可以从数组len()循环并使用list slip,但这个问题是否存在pythonic方式?

我尝试了X [1],发现类型(X [1])是一个int,无法追溯到数组X.

感谢您的帮助。

编辑:抱歉给您带来不便。我上面犯了一个错误。 对于窗口1,只有第一个元素1,所以输出1     窗口2:[1,3] - > 1     窗口3:[1,3,2] - > 1     窗口4:[3,2,5] - > 2

顺便说一句,这对你来说非常有帮助。谢谢。

4 个答案:

答案 0 :(得分:1)

map(min, zip(a[1:]+[max(a)], [max(a)]+a, a+[max(a)]))

我不知道它是否是一种pythonic方式。它只是一个棘手的单线程,并不比普通的循环更好。

答案 1 :(得分:1)

In [33]: X = [1, 3, 2, 5, 1, 3]

In [34]: list(map(min, (X[i:i+3] for i in range(len(X)-2))))
Out[34]: [1, 2, 1, 1]

答案 2 :(得分:0)

def pairwise( iterable, n=2 ):
    from itertools import tee, izip, islice
    return izip(*(islice(it,pos,None) for pos,it in enumerate(tee(iterable, n))))

 x = [1, 3, 2, 5, 1, 3]


list(pairwise(x,3))
#[(1, 3, 2), (3, 2, 5), (2, 5, 1), (5, 1, 3)]
map(min, pairwise(x,3))
#[1, 2, 1, 1]

答案 3 :(得分:0)

history = collections.deque((None, None), 2)  # sentinel
for x in your_input:
    result = min(x, min(history))
    history.append(x)

哨兵的选择取决于你想如何对待输入的开始。

或者如果这更清楚

window = collections.deque((), 3)
for x in your_input:
    window.append(x)
    result = min(window)

首先使用显式历史作为OP主题,最后一个显式窗口。

带有size参数的

deque会在超出大小时自动从追加的另一端删除元素。