不明白使用 zip(*) 如何解压缩数据



将数据从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)]

Pythonzip()方法的目的是映射多个容器的相似索引,以便它们可以作为单个实体使用。

在你的代码中:

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:返回单个迭代器对象,包含所有容器的映射值。

因此,它将整个返回值转换为元组。

相关内容

  • 没有找到相关文章

最新更新