Создать список строк с помощью скользящего окна, используя itertools, yield и iter () в Python 2.7.1? - PullRequest
3 голосов
/ 07 декабря 2011

Я пытаюсь сгенерировать функцию скользящего окна в 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' с аргументом внутри генератора"

Я действительно запутался. , ,

Ответы [ 6 ]

12 голосов
/ 07 декабря 2011

Вы хотите сказать, что хотите это сделать? :

a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']
4 голосов
/ 07 декабря 2011

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

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
0 голосов
/ 02 апреля 2014
>>>def window(data, win_size):
...    tmp = [iter(data[i:]) for i in range(win_size)]
...    return zip(*tmp)
>>> a = [1, 2, 3, 4, 5, 6]
>>> window(a, 3)
>>>[(1,2,3), (2,3,4), (3,4,5), (4,5,6)]
0 голосов
/ 07 декабря 2011

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

  [ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
0 голосов
/ 07 декабря 2011

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

def window(fseq, window_size=5):
    ....
        final.append(tentative_string)
    yield final
0 голосов
/ 07 декабря 2011
def window(fseq,fn):
    alpha=[fseq[i:i+fn] for i in range(len(fseq)-(fn-1))]
    return alpha
...