2017-09-29 2 views
1

C'est une question de débutant de python zip. Je suis en train de faire l'apprentissage en profondeur udacity LSTM. Il y a une ligne de code dont je ne comprends pas le fonctionnement.Qu'est-ce que zip dans ce code?

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

Il est copié à partir du contexte ci-dessous. J'essaie de le réécrire en boucle, mais il semble que je ne le fasse pas correctement. Quelqu'un peut-il m'aider à le réécrire en boucle?

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

lots lui-même est une liste, contient plusieurs 2-dim np.array. Disons que len (lots) = 11, lots [0] .shape = (64, 27) –

Répondre

2

x dans la boucle correspond à un tuple.

Une autre syntaxe est for a,b in zip mais ici, il est plus simple d'avoir un tuple à passer à join. Équivalent dans votre boucle:

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

qui est légèrement exagéré ici si vous me demandez, puisque vous avez seulement deux valeurs à join. Une autre façon serait:

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

et pour la compréhension:

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

join n'est pas plus rapide dans ce cas, puisque nous avons seulement 2 termes ajouter sans séparateur et join est un appel de fonction.

EDIT: maintenant je suis curieux, et je benching ceci:

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)) 

fonctionne en 14.80 secondes.

remplacer maintenant par:

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

et il fonctionne en 17.75 secondes. Donc, pour une fois + gagne ... join est utile pour éviter l'effet quadratique des chaînes sommateurs, qui est s'il y a plus de 2 cordes pour résumer ...

Ne pas utiliser join ici, l'utiliser lorsque vous avez plus de 2 valeurs à joindre et/ou un séparateur entre.