Создать список строк со скользящим окном, используя 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' с аргументом внутри генератора"
Я действительно смущен.,,
6 ответов
Вы имеете в виду, что вы хотите сделать это?:
a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']
Ваш генератор может быть намного короче:
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
Используйте функцию zip в одной строке кода:
[ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
def window(fseq,fn):
alpha=[fseq[i:i+fn] for i in range(len(fseq)-(fn-1))]
return alpha
Я не знаю, каков ваш или ожидаемый результат, но вы не можете смешивать yield
а также return
в одной функции. менять return
в yield
и ваша функция не выдаст эту ошибку снова.
def window(fseq, window_size=5):
....
final.append(tentative_string)
yield final
>>>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)]