for语句中的偏移量

时间:2013-12-18 22:07:34

标签: python for-loop element offset

我一直试图在for语句中进行偏移,以便我可以评估数据序列的变化。想知道我在这里做错了什么。也许对于声明来说,这不是最好的方法,所以尝试在if语句中使用next。这将用于大型数据集。

n = 1
data = [10,9,8,7,6,5,6,7,8,7,6]

def test(data,n):
    highs = []
    for d in data:
        if d > d[-n]:
            highs.extend([d])
    return highs


def test1(data,n):
    highs = []
    if data[n+1] > data[n]:
        highs.extend([data[n]])
        next
    else:
        next
    return highs

任何人都可以帮助解决这个问题吗?感谢

2 个答案:

答案 0 :(得分:0)

听起来你想要一个移动数据的滑动窗口,所以你可以比较每个元素到它之前的一个n?

您可以使用collections.deque(http://docs.python.org/2/library/collections.html#deque-objects):

from itertools import islice
from collections import deque
def windowed(items, size):
    items = iter(items)
    window = deque(islice(items, size), maxlen=size)
    while True:
        yield window
        window.append(items.next())

(使用maxlen意味着追加将最左边的元素推出固定大小的双端队列。)

然后您可以使用它来查看窗口中的第一个和最后一个项目:

for window in windowed(data, n):
    # do something with window[0] and window[-1]

快速访问双端队列的每一端 - O(1)。

答案 1 :(得分:0)

d[-n]data[n]的含义并不完全清楚。但我猜你的意思是列表中的前一个值(或当前位置 - 后退)。

这是找到大于前一个元素的问题的简单解决方案。只需将以前的值保存在变量中即可。

prev = data[0] 
highs = [prev] # should the 1st one be one the list?
for d in data:
    if d > prev:
        highs.append(d) # simpler than extend([d])
    prev = d  # update prev       
highs
# [10, 6, 7, 8]

另一种方法是步骤索引

for i in range(n, len(data)):
    if data[i]>data[i-n]
        ...

或使用enumerate获取索引

for i, d in enumerate(data):
    j = i - n
    if j>=0:
        if d > data[j]:
           ....