在Python 2.7.1中使用itertools、yield和iter()生成滑动窗口字符串列表?

8 投票
6 回答
12584 浏览
提问于 2025-04-17 07:51

我正在尝试在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 个回答

2

在一行代码中使用zip函数:

  [ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
7

你的生成器可以写得更简洁一些:

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
17

你的意思是你想这样做吗?:

a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']

撰写回答