Python 3 zip列表/元组解包是如何工作的?



我正在学习Python 3,我看到你可以压缩两个列表在一起,像这样:

l1 = [1,2,3]
l2 = ['a','b','c']
l3 = zip(l1,l2)
print(list(zip_L1L2))
# Output: [(1, 'a'), (2, 'b'), (3, 'c')]

然后像这样反转这个过程:

l4, l5 = zip(*l3)

但我不明白为什么它工作…

找到了!

当我试图清楚地写下我的问题时,我偶然发现了这个答案为什么x,y = zip(*zip(a,b))在Python中工作?,这给了我一个提示,我仍然没有得到之前尝试在一个REPL。关键是解包zip:

的结果
print(*zip(l1,l2))
# Output: (1, 'a') (2, 'b') (3, 'c')

我们得到3个包含2个元素的元组,它们被视为作为参数传递给zip的3个包含2个元素的列表:

l1 = [ 1 , 2 ]
l2 = ['a','b']
l3 = ['+','-']
print(list(zip(l1,l2,l3)))
# Output: [(1, 'a', '+'), (2, 'b', '-')]

※注意,如果使用3个包含4个元素的列表,zip将输出4个包含3个元素的列表

l1 = [ 1 , 2 , 3 , 4 ]
l2 = ['a','b','c','d']
l3 = ['+','-','*','/']
print(list(zip(l1,l2,l3)))
# Output: [(1, 'a', '+'), (2, 'b', '-'), (3, 'c', '*'), (4, 'd', '/')]

矩阵旋转我现在认为它是将矩阵中的值旋转90°,使行变成列,列变成行。

这就像通过提供行作为参数而不是矩阵本身来旋转矩阵。

多变量赋值和元组/列表解包

拼图的最后一块是解压缩结果,并使用多重赋值将每个元组赋给自己的变量!

l1 = [1,2,3]
l2 = ['a','b','c']
l3,l4= zip(*zip(l1,l2))
print('l3= ',l3)
print('l4= ', l4)
# Output: l3=  (1, 2, 3)
#         l4=  ('a', 'b', 'c')

后记

我决定继续写这个问题,通过解释我通过实验发现的东西来学习,因为我在写作时没有立即得到我发现的答案的含义。

我也希望我的类比与矩阵旋转可以帮助别人在将来更快地得到它。