2016-07-06 2 views
0

Gibt es eine Möglichkeit, den Einzug zu reduzieren, wenn Sie verschachtelte Schleifen verwenden, wie unten beschrieben?Einrückung reduzieren, wenn verschachtelte Python-Schleifen verwendet werden

for source_i in sources: 
    for source_j in sources: 
     for ni in source_i.nodes: 
      for nj in source_j.nodes: 
       if ni != nj: 
        do_thing(ni, nj) 
+0

Verschieben Sie die 'do_thing' Zeile an den Anfang mit einem' ['davor; entferne alle neuen Zeilen und Doppelpunkte; füge am Ende ein ']' hinzu. Voila! Aber bitte tu das nicht. List Comprehensions sind einfache Möglichkeiten zum Erstellen von Listen. Es ist keine gute Idee, eine Liste der Rückgabewerte von 'do_thing (...)' zu erstellen, wenn Sie sie nicht verwenden. List Comprehensions sollte zum Erstellen von Listen verwendet werden, nicht für ihre Nebenwirkungen. – zondo

Antwort

2
for source_i in sources: 
    for source_j in sources: 
     pass 

Dies ist dasselbe, wie in dem Produkt von sources kartesischen und sich durch die Paare iteriert. Dies kann in einer Zeile geschrieben werden, indem itertools importieren:

import itertools 
for (i,j) in itertools.product(sources, repeat=2): 
    pass 

gleiche Muster hier:

for (ni, nj) in itertools.product(i.nodes, j.nodes): 
    pass 

Sie nisten sie also jetzt können:

for ni in i.nodes: 
    for nj in j.nodes: 
     pass 

Dies kann wie folgt umgeschrieben werden

import itertools 
for (i,j) in itertools.product(sources, repeat=2): 
    for (ni, nj) in itertools.product(i.nodes, j.nodes): 
     if ni != nj: 
      do_thing(ni, nj) 
+1

'Produkt (Quellen, Quellen)' kann auch geschrieben werden als 'Produkt (Quellen, wiederholen = 2)' - ist praktisch, vor allem, wenn wir mehr als ein 2-dimensionales Produkt eines iterable mit sich selbst wollen. – plamut

+0

@plamut Ja, ich habe es oben und habe vergessen, es zu kopieren. :) Danke für den Tipp. – erip

2

Ja, eine Art und Weise verschachtelte Schleifen zu ersetzen ist itertools.product zu verwenden:

from itertools import product 

for source_i, source_j in product(sources, repeat=2): 
    for ni, nj in product(source_i.nodes, source_j.nodes): 
     ... 

product Die Funktion hat ein „kartesisches Produkt von Eingang Iterables“ (direkt aus der Dokumentation).

Verwandte Themen