2016-06-02 4 views
-1

Ich habe dieses unerwartetste Verhalten entdeckt, das ich nicht zu erklären vermag. Ich habe eine Python Funktion geschrieben eine PDB Datei zu analysieren (Atomkoordinaten für die Proteinstruktur), wie als eine Liste von Listen, zB:Python gibt während der Iteration eine Zeichenfolge anstelle der Liste zurück

[ 
['ATOM ', ' 1700', ' N ', ' ', 'VAL', ' B', ' 11', ' ', ' ', matrix([[-19.164, -27.781, -11.31 ]]), ' 1.00', ' 18.57', '  ', ' ', ' N', ' '], 
... 
] 

Wenn ich über die Liste iterieren, wie folgt:

for line in pdb[:50]: 
    print line, len(line), type(line) 

Ich bekomme jedes Element wie erwartet, mit 16 Elementen in jeder Liste.

Wenn ich jedoch laufen die folgenden:

for line in pdb: 
    print line, len(line), type(line) 

der 6. Zeile (bei 0 Nummerierung), ist eine Folge von Wert ' 311'. Dies tritt auch auf, wenn ich enumerate() verwende, um über pdub zu iterieren. Wenn ich dieses Element manuell mit pdb[6] extrahiere, handelt es sich um eine normale Liste mit 16 Elementen, und der Wert ' 311' erscheint nirgendwo in dieser Liste.

Das macht überhaupt keinen Sinn für mich!

+3

macht keinen Sinn für mich entweder machen. Kannst du versuchen, eine [MCVE] zur Verfügung zu stellen? –

+1

Sie sollten uns Details/Code über Ihre Parsing-Funktion geben, die Sie geschrieben haben – DomTomCat

+0

Welche Version von Python verwenden Sie? Sieht für mich ist es ein Nebeneffekt der Slicing Ihre Liste. – Paul

Antwort

0

Anmerkung: Nur wahr in Python3.X

Der Hauptunterschied zwischen for i in l[1:] (oder for i in list(l), solange Slicing nicht faul ist) und for i in l ist, wenn l ein Generator ist, wird die erste den ganzen Generator verarbeiten in eine Liste und dann zu for senden, wenn das zweite ein Element der l zum Zeitpunkt verarbeitet:

from time import sleep 
from multiprocessing import Pool 
from random import randint 
class Gen: 
    def __init__(self, limit): 
     self.__l = limit 
     self.__t = [] 
     self.__v = 0 

    def __iter__(self): 
     return self 

    def __next__(self): 
     self.__v += 1 
     if self.__v +1 >= self.__l: 
      raise StopIteration 
     print("NEXT:{}".format(self.__v)) 
     sleep(0.01) 
     w = 0 
     self.__t.append(self.__v) 
     return self.__t[:] 

r = Gen(1000) 

So

for i in r: 
    sleep(0.2) 
    print("--->R:{}".format(i[-1])) 

>>> NEXT:1 
--->R:1 
NEXT:2 
--->R:2 
NEXT:3 
--->R:3 
NEXT:4 
--->R:4 
NEXT:5 
... 

Und

for i in list(r): 
    sleep(0.2) 
    print("--->R:{}".format(i[0])) 

>>> NEXT:1 
NEXT:2 
NEXT:3 
NEXT:4 
NEXT:5 
... 
--->R:1 
--->R:2 
--->R:3 
--->R:4 
... 
Verwandte Themen