2017-09-29 9 views
1

初心者のpython zipの質問です。 私は今、udacity深い学習課題LSTMをやっています。 どのように動作するのか理解できないコード行があります。このコードのZIPは何ですか?

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

以下のコンテキストからコピーされます。

def batches2string(batches): 
    """Convert a sequence of batches back into their (most likely) string 
    representation.""" 
    s = [''] * batches[0].shape[0] 
    for b in batches: 
     s = [''.join(x) for x in zip(s, characters(b))] 
    return s 

私はforループで書き直そうとしていますが、正しく動作していないようです。誰かがforループで書き直す方法を教えてもらえますか?ループtupleと一致するで

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

バッチ自体がリストであり、複数の2次元np.arrayが含まれています。 len(バッチ)= 11、バッチ[0] .shape =(64,27)としましょう。 –

答えて

2

x

もう1つの構文はfor a,b in zipですが、ここではタプルをjoinに渡す方が簡単です。あなたが唯一の2つの値を持っているので、あなたがjoinに私に言わせれば、ここで少しやり過ぎである

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

:へのあなたのループで同等。もう一つの方法は、次のようになります。

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

と理解のために:我々は唯一の任意の区切りなしで追加する2項を持っているとjoinが関数呼び出しであるため、

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

joinは速く、その場合ではありません。

EDITは:今、私は好奇心旺盛だし、私はこれを突き当てています:14.80秒で

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

ランを。

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

をし、それは17.75 secondsにruns:

nowによってreplace。だからここjoinを使用しないでください

は... joinを合計する2つの以上の文字列がある場合には、文字列を合計の二次効果を避けるために有用である... +勝利に一度のために、あなたが持っているときにそれを使用結合する2つ以上の値および/またはその間のセパレータ。

関連する問題