Раздвижное окно с приращением переменной - Python - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь использовать функцию скользящего окна в Python для сравнения очень длинного списка значений. Код, который я нашел для функции скользящего окна, приведен ниже:

from itertools import islice

idlist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list = []

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
        result = result[1:] + (elem,)
        yield result

for i in window(idlist, n=2):
    list.append(i)

print list

Мой вопрос: как бы я изменил этот код, чтобы я мог изменить приращение окна (величину, которую оно перемещает после создания каждого кортежа) с 1 на гораздо большее целое число, скажем, 5 или 50? Я знаю, как изменить размер окна, но не приращение. Спасибо!

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Вам не нужно изменять приращение, вы можете взять каждый n-й элемент:

# taking every 3rd element moves the start by 3
print list(islice(window(idlist, n=2),None,None,3))

Не полностью оптимизирован, но прост.

0 голосов
/ 11 февраля 2015

возможно это решит проблему

L=[1,2,3,4,5]

def window(L, n=2, jump=1):
    lenght = len(L)
    assert n <= lenght
    for i in range(0,lenght-n+1,jump):
        yield tuple(L[i:i+n])

A=[]
for i in window(L, n=3, jump=1):
    A.append(i)

print A
0 голосов
/ 03 августа 2011

Подсказка: функцию next можно использовать для получения следующего элемента от итератора. Вам нужно получить и добавить несколько элементов за итерацию (я полагаю, что это трудность; наверняка вы видите, как переместить другой конец окна вперед на другую величину :)).

...