Python的zip从根本上不同于矩阵转置吗?

时间:2018-07-09 20:18:01

标签: python

据我了解,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

1 个答案:

答案 0 :(得分:4)

在有操作的情况下,您可以将操作描述为矩阵转置zip(*matrix)(或者在您的示例中,将行存储为列表,并存储在单独的变量中,而不是列表中, zip(a, b))是那个矩阵转置。 (即使matrixab是迭代器或某种虚拟序列或惰性序列,也是如此-基本上尽可能地延迟它们的转置。)

但是,它稍微更笼统。

例如,如果列表不相等,仍然可以zipzip将被截短为最短列表的长度),而这实际上不是“矩阵转置” ”。

您甚至可以将其与无限长的迭代器一起使用:zip(itertools.count(), a)将为您提供与enumerate(a)相同的功能,而无需编写zip(itertools.islice(itertools.count(), len(a)), a)

此外,请注意文档中的zip(*[iter(s)]*n)分块用法。除非换言之,否则尝试以转置迭代器矩阵的方式来思考,只会使人困惑而不是启迪。