据我了解,pythons zip接受一系列可迭代,然后将迭代器返回到包含每个迭代器一个元素的元组,这样第一个元组将包含每个迭代器的第一个元素。例如:
A = [1, 2, 3]
B = [4, 5, 6]
for a, b in zip(A, B):
print(f"{a}, {b}")
打印出:
1, 4
2, 5
3, 6
分别放置A和B,然后将A和B连接在一起,将得到精确的矩阵。两种操作在结果上是否存在差异,或者它们基本上是同一件事?
编辑: * Iterables
答案 0 :(得分:4)
在有操作的情况下,您可以将操作描述为矩阵转置zip(*matrix)
(或者在您的示例中,将行存储为列表,并存储在单独的变量中,而不是列表中, zip(a, b)
)是那个矩阵转置。 (即使matrix
或a
和b
是迭代器或某种虚拟序列或惰性序列,也是如此-基本上尽可能地延迟它们的转置。)
但是,它稍微更笼统。
例如,如果列表不相等,仍然可以zip
(zip
将被截短为最短列表的长度),而这实际上不是“矩阵转置” ”。
您甚至可以将其与无限长的迭代器一起使用:zip(itertools.count(), a)
将为您提供与enumerate(a)
相同的功能,而无需编写zip(itertools.islice(itertools.count(), len(a)), a)
。
此外,请注意文档中的zip(*[iter(s)]*n)
分块用法。除非换言之,否则尝试以转置迭代器矩阵的方式来思考,只会使人困惑而不是启迪。