(x, y) == tuple(zip(*zip(x,y))) 当且仅当以下两个语句为真时,才为true:
一种了解发生了什么的好方法是在每个步骤打印:
x = [1, 2, 3]
y = ["a", "b", "c", "d"]
print("1) x, y = ", x, y)
print("2) zip(x, y) = ", list(zip(x, y)))
print("3) *zip(x, y) = ", *zip(x, y))
print("4) zip(*zip(x,y)) = ", list(zip(*zip(x,y))))
哪个输出:
1) x, y = [1, 2, 3] ['a', 'b', 'c', 'd']
2) zip(x, y) = [(1, 'a'), (2, 'b'), (3, 'c')]
3) *zip(x, y) = (1, 'a') (2, 'b') (3, 'c')
4) zip(*zip(x,y)) = [(1, 2, 3), ('a', 'b', 'c')]
基本上就是这样:
x和y中的项目根据其各自的索引进行配对。
- 线对解包到3个不同的对象(元组)
- 将对传递到zip,zip将再次根据索引对每个项目进行配对:
- 来自所有输入的第一项配对:
(1, 2, 3)
- 来自所有输入的第二项配对:
('a', 'b', 'c')
现在您可以了解(x, y) == tuple(zip(*zip(x,y)))在这种情况下为什么为假:
- 由于
y的长度大于x,因此第一个压缩操作从中删除了多余的项目y(因为无法配对),因此此更改显然在第二个压缩操作中重新执行
- 类型不同,一开始我们有两个列表,现在我们有两个元
zip组,而在元组而不是列表中配对项目也是如此
如果您不是100%不确定要如何zip工作,我在这里为这个问题写了一个答案:解压缩和*运算符