2016-04-04 6 views
1

Ich habe eine Codezeile wie folgt aus:Gibt es eine Möglichkeit, ein Listenverständnis als for-Schleife umzuschreiben?

list1=[string1[i:i+int1] for i in range(0, len(string1), int1)] 

Ich erinnere mich an meine Lehrer sagen, dass wir neue Linien beginnen sollten, wenn ‚für‘ es so ist, ist es eine Möglichkeit, diesen Code zu schreiben, der wie folgt aussieht:

for i in range(0, len(string1), int1): 
    #something here 

oder etwas anderes?

+8

Bitte lesen Sie über [list comprehensions] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions). – Lafexlos

+8

Der Rat Ihres Lehrers ist eine zu starke Vereinfachung. Sie sollten eine neue Zeile beginnen, wenn es ein for _statement_ gibt, aber ein 'for' innerhalb eines Ausdrucks ist nicht Teil einer for-Anweisung; es ist Teil eines Listenverständnisses. – Kevin

+3

Ich bin mir fast sicher, dass dein Lehrer nicht gemeint hat, dass du auf alle [list comprehensions] (https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) zugunsten von explizit 'for' verzichten solltest Schleifen, die Stück für Stück eine "Liste" bilden. Wenn sie es tun, lehren sie dich nicht wirklich Python. – ShadowRanger

Antwort

5

Sie meinen, eine langweiliges altes regelmäßiges for loop von einem list-comprehension zu extrahieren?

list1=[string1[i:i+int1] for i in range(0, len(string1), int1)] 

Becomes:

list1 = list() 
for i in range(0, len(string1), int1): 
    list1.append(string1[i:i+int1]) 

Dies wäre hilfreich, wenn Sie die Ausnahmebehandlung hinzufügen wollen, Protokollierung oder komplexere Funktionen oder Verhaltensweisen, während Sie über Ihre Daten durchlaufen.

Zum Beispiel:

list1 = list() 
for i in range(0, len(string1), int1): 
    log.info('in loop: i={}'.format(i)) 
    try: 
     data = string1[i:i+int1] 
    except: 
     log.error('oh no!') 
     # maybe do something complex here to get some data anyway? 
     data = complex_function(i) 
    log.debug('appending to list: data={}'.format(data)) 
    list1.append(data) 

Aber allgemein gesprochen die Liste Verständnis eine völlig legitime Art und Weise ist, dass zu schreiben.

+0

alternativ könnte man eine Funktion schreiben und '[somefunction (val) für val in values]'. Angenommen, das war natürlich angemessen. Als eine andere potenziell angemessene Alternative könnte man, anstatt eine Liste zurückzugeben, "Daten liefern" und einen Generator aus dem Geschäft herausholen. –

+4

'[]' ist effizienter als 'list()'. Siehe [warum] (https://stackoverflow.com/questions/30216000/why-is-faster-than-list/30216156#30216156) – zondo

+4

@zondo: Auch vermeidet bequem das Problem der Leute Namen-Shadowing 'liste', obwohl im Idealfall würden sie das überhaupt nicht tun. :-) Das heißt, die zusätzlichen Kosten von 'list()' over '[]' ist ziemlich klein, etwa 60-70 extra ns auf meiner Maschine (zugegebenermaßen eine Erhöhung von 2-3,5x gegenüber den Basiskosten von '[] "von ~ 20-30 ns, aber es ist unwahrscheinlich, dass sie in allen außer den heißesten Schleifen von Bedeutung sind." – ShadowRanger

3

Sie müssen zuerst die leere Liste erstellen und dann für jede Iteration anhängen.

list1 = [] 
for i in range(0, len(string1), int1): 
    list1.append(string1[i:i+int1]) 
1

Diese Liste Verständnis übersetzen wäre:

l = [] 
for i in range(0, len(string1), int1): 
    l.append(string1[i:i+int1]) 
0

Little bit schmutzig, aber gute Alternative zur Aufspaltung Sammlung Subkollektionen einer festen Größe.

from itertools import zip_longest 

l = [] 
for chunk in zip_longest(*([iter(string1)]*int1), fillvalue=''): 
    l.append(''.join(chunk)) 
0
g = (string[i:i+int1] for i,char in enumerate(string) if i % int1 == 0) 
l = list(g) 

Nicht Einsatz len(iterable) in dem während mit Indizes zu tun. Verwenden Sie dazu enumerate(). Es ergibt (index, item). Dies ist effizient und pythonisch.

Die Idee, dass Sie eine neue Zeile während der Verwendung von for Schleife machen sollten, ist wahrscheinlich idiomatisch zu einer anderen Sprache, C, C++, z. Aber nicht in Python. Listen Comprehensions kommen aus der Haskell-Welt von FP. Das ist elegant, wie sie kommen.

Verwandte Themen