2016-05-16 3 views
1

Ich möchte einige Elemente aus einer Liste extrahieren und sie in Unterlisten speichern, aber Elemente sind nicht in Ordnung. beispielsweise für die folgende Liste:Extrahieren von Elementen in einer Liste, die nicht in Reihenfolge sind

F = ['mary', 'zari', 'ali', 'fari','Thaghi', 'zagi', 'shad', 'sila','bita'] 
A = [] 
B = [] 
C = [] 

Ich mag Punkt 1 in A setzen, Punkt 2 in B, Punkt 3 in C. Dann Punkt 4 in A, B in Position 5, Position 6 in C. Dann Punkt 7 in A, 8 in B und 9 in C. schrieb ich den folgenden Code:

i=0 
for i in range(len(F)): 
    A.append(F[i]) 
    B.append(F[i+1]) 
    if i < range(len(F)): 
     i=i+1 

Aber der Ausgang ist:

A.append(F[i]) 
B.append(F[i+1]) 
    if i < range(len(F)): 
     i=i+1 

IndexError: list index out of range. 

Antwort

3

das Problem in Ihrem Code ist, dass es keine F[i+1] wenn i das Ende von 012 erreicht. Listenkomprehensionen zu verwenden ist eine bessere Methode für dieses Problem:

F = ['mary', 'zari', 'ali', 'fari','Thaghi', 'zagi', 'shad', 'sila', 'bita'] 
A = [item for i, item in enumerate(F) if i % 3 == 0] 
B = [item for i, item in enumerate(F) if i % 3 == 1] 
C = [item for i, item in enumerate(F) if i % 3 == 2] 

das Ergebnis wäre:

>>> A 
['mary', 'fari', 'shad'] 
>>> B 
['zari', 'Thaghi', 'sila'] 
>>> C 
['ali', 'zagi', 'bita'] 
+0

Die zweite Methode behandelt Fälle nicht richtig, wenn 'F' kein genaues Vielfaches von 3 Elementen enthält. – martineau

+0

@martineau Sie haben Recht; entfernt diesen Teil. Danke für die Köpfe hoch! – Selcuk

+0

Dies könnte auch prägnanter über 'A, B, C = [[Element für i, Element in Aufzählung (F), wenn i% 3 == n] für n in Bereich (3)]' erfolgen. – martineau

3

Dies wird für beliebige Längen von F arbeiten:

A, B, C = [F[i::3] for i in range(3)] 

Es macht drei Scheiben beginnend bei Indizes 0, 1, 2, jeweils den ganzen Weg bis zum Ende und jeweils mit einer step Länge von 3.

+0

Ich wünschte, ich könnte Bonuspunkte geben, wenn ich 'zip()' nicht verwende ... – martineau

+0

@martineau Hm. Im Allgemeinen benutze ich 'zip()' sehr, aber hier sollte die Leistung der Scheibe ausreichen. Gibt es irgendetwas inhärent schlechtes an 'zip()?' – schwobaseggl

+0

Nein, es einfach besser nutzen zu können (kürzer und schneller) als es zu brauchen - und sehr clever. – martineau

Verwandte Themen