2016-10-18 3 views
0

Ich habe versucht, pop Elemente in Liste Verständnis mit takewhile Funktion und ich kam in Sachen, die für mich schwer zu verstehen ist. Meine Terminal-Sitzung sieht wie folgt aus:Unvollständige Liste Pop in Liste Verständnis

enter image description here

aber wenn ich das Gleiche versucht, mit Streichern dann Problem nicht auftreten:

enter image description here

Kann mir jemand erklären, dass in den geschah erstes Szenario? Warum hat g.pop(0) nur [1, 2] zurückgegeben?

Transcript für das Kopieren (warum Stapel nicht zusammenklappbare Abschnitte):

>>> from itertools import takewhile 
from itertools import takewhile 
>>> g = [1,2,3,4,5] 
>>> [a for a in takewhile(lambda x: x < 4, g)] 
[1, 2, 3] 
>>> [g.pop() for _ in takewhile(lambda x: x < 4, g)] 
[5, 4, 3] 
>>> g = [1,2,3,4,5] 
>>> [g.pop(0) for _ in takewhile(lambda x: x < 4, g)] 
[1, 2] 

>>> g = ['1', '2', '3', '4', '5'] 
>>> [a for a in takewhile(lambda x: x != '4', g)] 
['1', '2', '3'] 
>>> [g.pop() for _ in takewhile(lambda x: x != '4', g)] 
['5', '4', '3'] 
>>> g = ['1', '2', '3', '4', '5'] 
>>> [g.pop(0) for _ in takewhile(lambda x: x != '4', g)] 
['1', '2', '3'] 

Antwort

1

ich es herausgefunden, weil ich versucht habe deque zu verwenden, die RuntimeError: deque mutated during iteration angehoben.

Ausführung geht so:

  1. g[0] = 1 < 4; g.pop(0) => 1
  2. g[1] = 3 < 4; g.pop(0) => 2
  3. g[2] = 5 > 4; break

Dies erklärt auch, warum es in der 2. Fall gearbeitet, weil während der Iteration '4' nicht betroffen.