将数据从4 × 3矩阵转置到3 × 4矩阵:
data = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))
data_transpose = tuple(zip(*data))
print(data_transpose)
输出为:
((0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11))
我不明白它为什么会有这样的行为。
我知道如果我循环相同的数据,如果我使用zip(* data)
,我可以得到索引而是一行tuple(zip(*data))
。我不明白输出是如何变成3 × 4矩阵的。
zip
方法从每个可迭代对象中聚集元素,使用星号运算符允许将每个元组(包含3个元素)作为分隔符传递
zip(*data)
# does :
zip((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))
按索引
进行聚合index --> 0 1 2
| | |
v v v
1st param : 0 1 2
2nd param : 3 4 5
3rd param : 6 7 8
4th param : 9 10 11
使3元组为4,根据前一张图
index
0 (0, 3, 6, 9)
1 (1, 4, 7, 10)
2 (2, 5, 8, 11)
当zip
输出一个迭代器时,您需要一个方法来读取它,例如list或tuple
data_transpose = tuple(zip(*data))
print(data_transpose) # ((0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11))
data_transpose = list(zip(*data))
print(data_transpose) # [(0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11)]
Python
zip()
方法的目的是映射多个容器的相似索引,以便它们可以作为单个实体使用。
在你的代码中:
data = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))
执行以下操作:这里有3个值
(0,3,6,9)
(1,4,7,10)
(2,5,8,111)
您正在使用*
解包元组。所以,所有的元素都在zip()
中传递。
链接逻辑:
tuple()
:这个函数接受一个参数iterable(可选)。它是一个可迭代对象(列表,范围等)
zip
:返回单个迭代器对象,包含所有容器的映射值。
因此,它将整个返回值转换为元组。