2017-09-29 114 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循環中重寫它?

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-dim np.array。比方說len(批次)= 11,批次[0] .shape =(64,27) –

回答

2

x在循環相匹配的tuple

另一種語法是for a,b in zip但在這裏更容易有一個元組傳遞到join。相當於在循環到:

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

如果你問我,因爲你只有2值join這是稍微矯枉過正這裏。另一種方法是:

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

和理解:

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

join是不是在這種情況下,更快,因爲我們只有2項沒有任何分隔添加和join是一個函數調用。

編輯:現在我很好奇,而我這個鉗工:

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

14.80秒運行。

取代現在由:

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

和它17.75秒運行一次。所以,這一次+勝... join有助於避免字符串相加的二次效應,即如果有超過2串來總結......

不要在這裏使用join,使用它時,你有超過2個數值加入和/或在它們之間的分隔符。