这段代码中有什么拉链?

时间:2017-09-29 04:38:14

标签: python zip

这是初学者的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)

1 个答案:

答案 0 :(得分:2)

循环中的

xtuple匹配。

另一种语法是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个和/或介于两者之间,请使用它。