2017-09-29 2 views
1

Es ist eine Anfängerfrage von Python Zip. Ich mache jetzt Udacity Deep Learning Assignment LSTM. Es gibt eine Codezeile, die ich nicht verstehe, wie es funktioniert.Was enthält diesen Code?

s = [''.join(x) for x in zip(s, characters(b))] 

Es wird aus dem folgenden Kontext kopiert.

Ich versuche es in For-Schleife umschreiben, aber es scheint, dass ich nicht richtig mache. Kann mir jemand helfen, es in For-Schleife umzuschreiben?

s1 = [''] * batches[0].shape[0] 
for b in batches: 
    for x in zip(s1, characters(b)): 
     print(x) 
     s1.append(x) 
     print(s1) 
+1

Chargen selbst ist eine Liste, enthält mehrere 2-dim np.array. Nehmen wir an, len (Chargen) = 11, Chargen [0] .shape = (64, 27) –

Antwort

2

x in der Schleife entspricht einem tuple.

Eine andere Syntax ist for a,b in zip, aber hier ist es einfacher, ein Tupel zu haben, das an join übergeben wird. Entspricht in der Schleife zu:

s1.append("".join(x)) 

, die hier etwas übertrieben ist, wenn Sie mich fragen, da Sie nur 2 Werte join haben. Eine weitere Möglichkeit wäre:

for a,b in zip(s1, characters(b)): 
    s1.append(a+b) 

und für das Verständnis:

s = [a+b for a,b in zip(s, characters(b))] 

join ist nicht schneller in diesem Fall, da wir nur zwei Begriffe haben ohne Trennzeichen hinzufügen und join ist ein Funktionsaufruf.

EDIT: jetzt bin ich neugierig, und ich bin benching dies:

l = ["foo","bar","spam","egg""hello","world"] 

start = time.time() 

for _ in range(10000000): 
    s = [a+b for a,b in zip(l,l)] 

end = time.time() 
print("elapsed {}".format(end-start)) 

läuft in 14.80 Sekunden.

jetzt ersetzen durch:

s = ["".join(x) for x in zip(l,l)] 

und es läuft in 17.75 Sekunden. Also einmal + gewinnt ... join ist hilfreich, um den quadratischen Effekt der Addition Strings zu vermeiden, das heißt, wenn es mehr als 2 Strings zu fassen ...

Sie join hier nicht verwenden, verwenden Sie es, wenn Sie mehr als 2 Werte zu verbinden und/oder ein Trennzeichen dazwischen.

Verwandte Themen