这是初学者的python zip问题。 我现在正在做深度学习任务LSTM。 有一行代码,我不明白它是如何工作的。
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)
答案 0 :(得分:2)
x
与tuple
匹配。
另一种语法是for a,b in zip
但是这里有一个传递给join
的元组更简单。在您的循环中等效于:
s1.append("".join(x))
如果你问我,那么这里有点矫枉过正,因为join
只有2个值。另一种方式是:
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个和/或介于两者之间,请使用它。