我一直试图在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
任何人都可以帮助解决这个问题吗?感谢
答案 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]:
....