2016-03-30 9 views
0
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s="aaabbc" 
>>> import itertools 
>>> gs=itertools.groupby(s) 
>>> for key, group in gs: 
... print(key, group) 
... print(list(group)) 
... print(key, group, list(group)) 
... 
a <itertools._grouper object at 0x7fd246da3278> 
['a', 'a', 'a'] 
a <itertools._grouper object at 0x7fd246da3278> [] 
b <itertools._grouper object at 0x7fd246da32e8> 
['b', 'b'] 
b <itertools._grouper object at 0x7fd246da32e8> [] 
c <itertools._grouper object at 0x7fd246da39b0> 
['c'] 
c <itertools._grouper object at 0x7fd246da39b0> [] 

Da der Code zeigte, ist es erstaunlich, was in über for-Schleife: in einer Iteration, der Schlüssel und das itertools._groupre Objekt nicht ändern, aber die Ergebnisse der Liste (Gruppe) geändert Genau. Die 2. Liste (Gruppe) hat keine. Ich kann einfach nicht herausfinden warum. WARUM? (Mein Englisch ist nicht so gut, ich hoffe, Sie können verstehen, was ich fragte)Iteration in Python3

+2

Generatoren können ihre Werte * nur einmal * erzeugen. Wenn Sie 'None' nicht erhalten, erhalten Sie eine leere Liste, weil der' group' Generator durch den ersten 'list()' Aufruf erschöpft wurde. –

Antwort

3

Generatoren können nur über einmal iteriert werden. Jeder group im groupby() Ergebnis ist ein solcher Generator. Der Aufruf von list() an einem Generator bewirkt, dass er alle Werte liefert, wonach der Generator leer leer ist und nicht zurückgesetzt werden kann; ein zweiter list() Aufruf desselben Objekts führt dann einfach zu einer leeren Liste, da der Generator keine Werte mehr liefert, die in die Liste aufgenommen werden.

Shop das Ergebnis list() in eine neue Variable statt:

for key, group in gs: 
    group_result = list(group) 
    print(key, group) 
    print(group_result) 
    print(key, group, group_result) 

Nun rufen Sie list() am Generator nur das einmal, und das Ergebnis wiederverwenden.

+0

Okay, es ist ein Generator. Ich hab es geschafft. Ich weiß, dass der Generator nur einmal durchlaufen werden kann, aber ich habe nicht herausgefunden, dass diese Gruppe ein Generator ist. Ich werde von nun an vorsichtig mit Generator sein. Danke ~ – kissg