据我所知,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
发布于 2018-07-10 04:27:40
在存在操作的情况下,您可以将该操作描述为矩阵转置,zip(*matrix)
(或者,在您的示例中,将行作为列表存储在单独的变量中,而不是列表的列表中,zip(a, b)
)就是矩阵转置。(这是真的,即使matrix
或a
和b
是迭代器,或者是某种虚拟的或惰性的序列-它基本上尽可能地懒惰地调换它们。)
但是,它稍微更通用一些。
例如,如果您有不相等的列表,您仍然可以对它们进行转置( zip
将被截断为最短列表的长度),这并不是真正意义上的“矩阵转置”。
您甚至可以将其用于无限长度的迭代器:zip(itertools.count(), a)
将为您提供与enumerate(a)
相同的功能,而您不必编写zip(itertools.islice(itertools.count(), len(a)), a)
。
另外,请注意文档中的zip(*[iter(s)]*n)
分块习惯用法。试图从转置迭代器矩阵的角度来思考这一点只会让人困惑,而不是启发,除非你已经直观地理解了这个习惯用法本身的术语。
https://stackoverflow.com/questions/51253417
复制相似问题