Genereer een lijst met strings met een schuifvenster met itertools, yield en iter () in Python 2.7.1?

Ik probeer een schuifraamfunctie in Python te genereren. Ik heb uitgezocht hoe het moet, maar niet alles binnen de functie. itertools, yield en iter() zijn geheel nieuw voor mij.

ik wil invoeren

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

de manier waarop ik het heb laten werken was

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

wat is in de war over hoe de uiteindelijke waarde van de functie binnen de functie moet worden gebruikt?

hier is mijn code voor de functie

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

ik wil dat het de bijgevoegde lijst retourneert, maar wanneer ik druk op het uitvoeren, staat er "Er is een fout in je programma * 'terug' met argument in generator"

Ik ben erg in de war . . .

2
toegevoegd de auteur Jon-Eric, de bron
Slecht vond ik dat ik de ander had kunnen verwijderen
toegevoegd de auteur O.rka, de bron
Kerel ... ga je om de 8 uur dezelfde vraag stellen? :O
toegevoegd de auteur mac, de bron
Het zou nog steeds verkeerd zijn geweest: als je een vraag stelt en je krijgt geen antwoorden, zijn de kansen: (1) je hebt het slecht geformuleerd [→ bewerken] - (2) het is een moeilijke vraag [→ beantwoord jezelf een vraag, krijg reputatiepunten en plaats er een beloning voor]. Overdragen om aandacht te trekken is geen welkom gedrag op SO (hoewel ik er zeker van ben dat je het niet hebt gedaan met de bedoeling enig kwaad te doen!) :)
toegevoegd de auteur mac, de bron

6 antwoord

Bedoel je dat je dit wilt doen? :

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

Uw generator kan veel korter zijn:

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
3
toegevoegd
dit is absoluut de betere optie. ik wist niet wat generatoren op dat moment waren en had niet te maken met grote datasets zoals ik nu doe
toegevoegd de auteur O.rka, de bron
def window(fseq,fn):
    alpha=[fseq[i:i+fn] for i in range(len(fseq)-(fn-1))]
    return alpha
0
toegevoegd

Ik weet niet wat uw invoer of verwachte uitvoer is, maar u kunt opbrengst en retour niet in één functie mengen. verander return in yield en uw functie zal die fout niet opnieuw genereren.

def window(fseq, window_size=5):
    ....
        final.append(tentative_string)
    yield final
0
toegevoegd

Gebruik de zip-functie in één regelcode:

  [ "".join(j) for j in zip(*[fseq[i:] for i in range(window_size)])]
0
toegevoegd
>>>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
toegevoegd