Создать список строк со скользящим окном, используя itertools, yield и iter() в Python 2.7.1?

Я пытаюсь создать функцию скользящего окна в Python. Я понял, как это сделать, но не все внутри функции. itertools, yield и iter() совершенно новые для меня.

я хочу ввести

a='abcdefg'
b=window(a,3)
print b
['abc','bcd','cde','def','efg']

то, как я это сделал, было

def window(fseq, window_size=5):
    import itertools
    tentative=[]
    final=[]
    iteration=iter(fseq)
    value=tuple(itertools.islice(iteration,window_size))
    if len(value) == window_size:
        yield value
    for element in iteration:
        value = value[1:] + (element,)
        yield value

a='abcdefg'
result=window(a)
list1=[]
for k in result:
    list1.append(k)
list2=[]   
for j in list1:
    tentative=''.join(j)
    list2.append(tentative)
print list2

в основном, что меня смущает, так это то, как использовать конечное значение функции внутри функции?

вот мой код функции

def window(fseq, window_size=5):
    import itertools
    tentative=[]
    final=[]
    iteration=iter(fseq)
    value=tuple(itertools.islice(iteration,window_size))
    if len(value) == window_size:
        yield value
    for element in iteration:
        value = value[1:] + (element,)
        yield value
    for k in value:
        tentative.append(k)
    for j in tentative:
        tentative_string=''.join(j)
        final.append(tentative_string)
    return final



seq='abcdefg'
uence=window(seq)
print uence

я хочу, чтобы он возвращал объединенный список, но когда я нажимаю его, он говорит: «В вашей программе * 'return' с аргументом внутри генератора есть ошибка»

Я действительно смущен . . .


person O.rka    schedule 06.12.2011    source источник
comment
возможный дубликат разделенной строки Python в движущемся окне   -  person Jon-Eric    schedule 07.12.2011
comment
Чувак... ты собираешься постить один и тот же вопрос каждые 8 ​​часов? :о   -  person mac    schedule 07.12.2011
comment
Плохо, я думал, что смогу удалить другой   -  person O.rka    schedule 07.12.2011
comment
Это все равно было бы неправильно: если вы задаете вопрос и не получаете ответов, то, скорее всего: (1) вы его плохо сформулировали [ → отредактируйте] - (2) это сложный вопрос [ → ответьте себе на какой-то вопрос, получите очки репутации и назначьте за это награду]. Повторная публикация для привлечения внимания не является желательным поведением на SO (хотя я уверен, что вы не делали этого с намерением причинить какой-либо вред!) :)   -  person mac    schedule 07.12.2011


Ответы (4)


Ты имеешь в виду, что хочешь сделать это? :

a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']
person Cédric Julien    schedule 07.12.2011
comment
Должны ли мы использовать диапазон вместо xrange для большей совместимости с python 3? - person Clement H.; 18.06.2019
comment
@КлементХ. исходный OP был об установке python2.7, поэтому в этом случае xrange был лучшим (для потребления памяти). Тем не менее, в python3 range было бы лучшим решением. Если у вас нет слишком большого числа для итерации, оставьте range везде, в противном случае используйте six . - person Cédric Julien; 18.06.2019

Ваш генератор может быть намного короче:

def window(fseq, window_size=5):
    for i in xrange(len(fseq) - window_size + 1):
        yield fseq[i:i+window_size]


for seq in window('abcdefghij', 3):
    print seq


abc
bcd
cde
def
efg
fgh
ghi
hij
person eumiro    schedule 07.12.2011
comment
это определенно лучший вариант. я не знал, что такое генераторы в то время, и мне не приходилось иметь дело с большими наборами данных, как сейчас - person O.rka; 14.04.2016

Используйте функцию zip в однострочном коде:

  [ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
person risent    schedule 07.12.2011

Я не знаю, каков ваш ввод или ожидаемый результат, но вы не можете смешивать yield и return в одной функции. измените return на yield, и ваша функция больше не будет выдавать эту ошибку.

def window(fseq, window_size=5):
    ....
        final.append(tentative_string)
    yield final
person Serdalis    schedule 07.12.2011