zip() можно использовать для транспонирования многомерных массивов (например, списков списков).
  matrix = [[1, 2, 3], [4, 5, 6]], то list(zip(*matrix)) вернет [(1, 4), (2, 5), (3, 6)], то есть поменяет строки и столбцы местами.
  *matrix распаковывает массив, и zip() итерируется по элементам каждой "строки" параллельно.
Функция zip() в Python полезна для обработки многомерных массивов (например, списков списков или NumPy массивов) путем итерации по нескольким итерируемым объектам одновременно.
Вот несколько примеров, как можно использовать zip():
Самый распространенный вариант использования zip() с многомерными массивами – транспонирование матрицы.  Транспонирование означает, что строки меняются местами со столбцами.
matrix = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
transposed_matrix = list(zip(*matrix))
print(transposed_matrix)  # Вывод: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
      В этом примере zip(*matrix) разворачивает матрицу, передавая строки матрицы как отдельные аргументы в zip(). zip() возвращает итератор, который возвращает кортежи, каждый из которых содержит элементы из соответствующих позиций в исходных строках.  list() преобразует этот итератор в список кортежей.  В результате получается транспонированная матрица.
Можно использовать zip() для непосредственной итерации по столбцам многомерного массива:
matrix = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
for column in zip(*matrix):
    print(column)
# Вывод:
# (1, 4, 7)
# (2, 5, 8)
# (3, 6, 9)
      Этот код итерируется по каждому столбцу матрицы, предоставляя возможность обработки данных по столбцам.
Если у вас есть несколько массивов (например, массивы, представляющие разные свойства объектов), которые нужно обработать параллельно, zip() может быть очень полезным:
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
cities = ["New York", "London", "Paris"]
for name, age, city in zip(names, ages, cities):
    print(f"{name} is {age} years old and lives in {city}")
# Вывод:
# Alice is 25 years old and lives in New York
# Bob is 30 years old and lives in London
# Charlie is 28 years old and lives in Paris
      В этом примере zip() позволяет итерировать по массивам names, ages и cities одновременно, что упрощает обработку связанных данных.
zip() можно использовать для создания словаря из многомерных массивов, например, для сопоставления ключей и значений:
keys = ["a", "b", "c"]
values = [1, 2, 3]
my_dict = dict(zip(keys, values))
print(my_dict) # Вывод: {'a': 1, 'b': 2, 'c': 3}
      Важно помнить: zip() прекращает итерацию, когда один из переданных итерируемых объектов заканчивается. Если ваши массивы имеют разную длину, следует рассмотреть возможность использования itertools.zip_longest() для обработки всех элементов, возможно, с заполнением отсутствующих значений.