2016-05-20 12 views
0

Ich habe Probleme zu verstehen, was der Unterschied in dem Code ist, den ich hier modifiziere. Der erste Abschnitt ist direkt von python documentation.Konvertieren Sie diese verschachtelte Ein-Zeilen-Schleife in mehrere Zeilen in Python

def product(*args, **kwds): 
    pools = map(tuple, args) * kwds.get('repeat', 1) 
    result = [[]] 
    for pool in pools: 
     result = [x+[y] for x in result for y in pool] 
    for prod in result: 
     yield tuple(prod) 

ich ein sehr ähnliches Stück Code machen wollte, haben aber Bedingungen, wenn wir das Produkt für bestimmte Elemente in den Argumenten tatsächlich nehmen, so wollte ich die Linie konvertieren result = [x+[y] for x in result for y in pool] in mehrere Zeilen, dann könnte ich meine if-Anweisungen und solche verwenden. Hier ist, was ich tat, aber wenn ich es laufen, so scheint es, in einer unendlichen Schleife stecken zu bleiben, oder etwas ...

def Myproduct(*args, **kwds): 
    pools = map(tuple, args) * kwds.get('repeat', 1) 
    result = [[]] 
    for pool in pools: 
     for x in result: 
      for y in pool: 
       result.append(x+[y]) 
    for prod in result: 
     yield tuple(prod) 

Ich mag würde, um tatsächlich den Unterschied verstehen hier. Ich habe gelesen und denke, ich bekomme this post, aber ich sehe nicht, wie man in diesem Fall richtig konvertieren, oder warum es nicht die gleiche Konvertierung mindestens ist. Vielen Dank im Voraus.

Antwort

4

Das Problem ist, dass Sie zu der Liste hinzufügen, die Sie durchlaufen. Also, wenn auf dem ersten, result = [[]] und pools = [1, 2, 3], dann nach der ersten Iteration über for x in result, Ihre Liste [[], [] + [1]] sein werden, so ist, dann werden Sie das zweite Element greifen usw.

Die Liste Verständnis wird eine neue Liste in einer Zeile zu schaffen und dann umbenennen, um auf Ergebnis zu mappen.

Seien Sie sehr vorsichtig beim Ändern von Listen, über die Sie iterieren! Hier

2

ist eine Ersatzfunktion:

def myproduct(*args, **kwds): 
    pools = map(tuple, args) * kwds.get('repeat', 1) 
    result = [[]] 
    for pool in pools: 
     nresult = [] 
     for x in result: 
      for y in pool: 
       nresult.append(x+[y]) 
     result = nresult 
    for prod in result: 
     yield tuple(prod) 

Beachten Sie, dass nresult erstellt wird, das Problem durch JETM darauf zu vermeiden.

+0

Vielen Dank! Ich wünschte, ich könnte beide Antworten akzeptieren. Sehr hilfreich. –

Verwandte Themen