(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працює, я написав відповідь на це запитання тут: Розпакування та оператор *