7

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' with argument inside generator」と表示されます

私は本当に混乱しています。. .

4

6 に答える 6

17

あなたはこれをしたいという意味ですか?:

a='abcdefg'
b = [a[i:i+3] for i in xrange(len(a)-2)]
print b
['abc', 'bcd', 'cde', 'def', 'efg']
于 2011-12-07T08:39:32.240 に答える
5

ジェネレーターはもっと短くなる可能性があります。

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
于 2011-12-07T08:41:20.063 に答える
1
def window(fseq,fn):
    alpha=[fseq[i:i+fn] for i in range(len(fseq)-(fn-1))]
    return alpha
于 2011-12-07T08:39:23.470 に答える
1

1 行のコードで zip 関数を使用します。

  [ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
于 2011-12-07T09:19:02.400 に答える
0

入力または期待される出力が何であるかはわかりませんが、1つの関数に混在さyieldせることはできません。returnに変更returnするyieldと、関数はそのエラーを再度スローしません。

def window(fseq, window_size=5):
    ....
        final.append(tentative_string)
    yield final
于 2011-12-07T08:39:48.023 に答える