(x, y) == tuple(zip(*zip(x,y)))
верно, если и только если два следующих утверждения верны:
x
и y
имеют одинаковую длину
x
и y
являются кортежами
Один хороший способ понять, что происходит, - это печатать на каждом шаге:
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, который снова объединяет все элементы на основе индексов:
- парные первые элементы со всех входов:
(1, 2, 3)
- парные элементы со всех входов:
('a', 'b', 'c')
Теперь вы можете понять, почему (x, y) == tuple(zip(*zip(x,y)))
является ложным в этом случае:
- , поскольку
y
длиннее x
, первая операция zip удалила дополнительный элемент из y
(поскольку его нельзя было спарить), это изменение, очевидно, повторяется во второй операции zip
- типы различаются, в начале у нас было два списка, теперь у нас есть два кортежа, так как
zip
делает парные элементы в кортежах, а не в списках
Если вы не уверены на 100%, что понимаете, как zip
работает, я написал ответ на этот вопрос здесь: Распаковка и оператор *