# Python: Транспонирование списка списков (5 простых способов!)

В этом руководстве вы узнаете, как использовать Python для транспонирования списка списков, иногда называемого двумерным массивом. При транспонировании списка списков мы по существу превращаем строки матрицы в ее столбцы, а столбцы - в строки. Это очень полезный навык при изучении машинного обучения.

В этом руководстве вы узнаете, как сделать это с помощью циклов `for`, списочных включений, функции `zip()`, библиотеки `itertools`, а также используя популярную библиотеку numpy для выполнения этой задачи.

#### Содержание

* Что означает транспонировать список списков в Python?
* Транспонирование списка списков с помощью Numpy
* Использование функции `Zip` для транспонирования списков в Python
* Использование `Itertools` для транспонирования списка списков
* Транспонирование списка списков с помощью цикла `For`
* Использование списочного включения для транспонирования списков в Python
* Заключение

### Что означает транспонировать список списков в Python?

Транспонирование массивов - это распространенная функция, которую часто нужно выполнять при работе над проектами машинного обучения. Но что именно означает транспонировать список списков в Python?

Мы можем рассматривать подсписки в нашем списке списков в Python как строки матрицы. Когда мы транспонируем список списков, мы по существу превращаем строки нашей матрицы в столбцы и столбцы - в строки.

Посмотрим, как это выглядит визуально:

```python
original = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

transposed = [
    [1, 4, 7], 
    [2, 5, 8], 
    [3, 6, 9]
]
```

### Транспонирование списка списков с помощью Numpy

Python предоставляет отличную утилиту `numpy`, которая делает работу с числовыми операциями невероятно простой! <mark style="color:blue;">**Numpy**</mark> поставляется с различными типами объектов, один из которых - массив `numpy.` Эти массивы имеют много общего со списками Python, но также позволяют выполнять ряд полезных математических операций.

Одной из таких операций является транспонирование данных с использованием метода `.transpose()`, который также может быть сокращен до .T.

Перед использованием этих методов нам нужно преобразовать наш список или список списков в массив `numpy`.

```python
# Транспонирование списка списков в Python с помощью numpy
import numpy as np

list_of_lists = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

array = np.array(list_of_lists)
transposed_array = array.T
transposed_list_of_lists = transposed_array.tolist()

# Это то же самое, что: transposed = np.array(list_of_lists).T.tolist()

print(transposed_list_of_lists)

# Возвращает
# [
#     [1, 4, 7], 
#     [2, 5, 8], 
#     [3, 6, 9]
# ]
```

### Использование функции `Zip` для транспонирования списков в Python

Функция `zip()` - невероятно полезный метод, который позволяет получить **n**-й элемент итерируемого объекта последовательно при переборе нескольких итерируемых объектов.

```python
# Транспонирование списка списков в Python с помощью zip
import numpy as np

list_of_lists = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]
transposed_tuples = list(zip(*list_of_lists))
# Выглядит как: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

transposed = [list(sublist) for sublist in transposed_tuples]
print(transposed)

# Возвращает
# [
#     [1, 4, 7], 
#     [2, 5, 8], 
#     [3, 6, 9]
# ]
```

### Использование `Itertools` для транспонирования списка списков

Иногда при работе со списками списков в Python вы столкнетесь с подсписками разной длины. В этих случаях функция `zip()` будет исключать все, что больше длины самого короткого подсписка.

```python
# Транспонирование списка списков в Python с помощью itertools
from itertools import zip_longest

list_of_lists = [
    [1,2,3],
    [4,5,6],
    [7,8,9,10]
]

tranposed_tuples = zip_longest(*list_of_lists, fillvalue=None)
transposed_tuples_list = list(tranposed_tuples)
print(list(transposed_tuples_list))

# Возвращает: [(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, None, 10)]

transposed = [list(sublist) for sublist in transposed_tuples_list]
print(transposed)

# Возвращает
# [
#     [1, 4, 7], 
#     [2, 5, 8], 
#     [3, 6, 9],
#     [None, None, 10]
# ]
```

### Транспонирование списка списков с помощью цикла `For`

Циклы `for` в Python - это невероятные инструменты для лучшего понимания работы некоторых алгоритмов.

```python
# Транспонирование списка списков в Python с помощью циклов for

list_of_lists = [
    [1,2,3],
    [4,5,6],
    [7,8,9,10]
]

transposed = list()

for i in range(len(list_of_lists[0])):
    row = list()
    for sublist in list_of_lists:
        row.append(sublist[i])
    transposed.append(row)

print(transposed)

# Возвращает
# [
#     [1, 4, 7], 
#     [2, 5, 8], 
#     [3, 6, 9]
# ]
```

### Использование списочного включения для транспонирования списков в Python

```python
# Транспонирование списка списков в Python с помощью списочного включения

list_of_lists = [
    [1,2,3],
    [4,5,6],
    [7,8,9,10]
]

transposed = [[row[i] for row in list_of_lists] for i in range(len(list_of_lists[0]))]
print(transposed)

# Возвращает
# [
#     [1, 4, 7], 
#     [2, 5, 8], 
#     [3, 6, 9]
# ]
```

### Заключение

В этой статье вы научились транспонировать список списков или двумерный массив в Python. Вы узнали, как сделать это с помощью популярной библиотеки для науки о данных `numpy`, а также используя встроенную функцию `zip()`, либо самостоятельно, либо с библиотекой `itertools`. Вы также изучили более простые методы выполнения этой задачи с помощью циклов `for` и списочных включений в Python.

Чтобы узнать больше о методе `numpy transpose`, ознакомьтесь с [официальной документацией здесь](https://numpy.org/doc/stable/reference/generated/numpy.transpose.html)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bemind.gitbook.io/neural/python/python-lists/python-transponirovanie-spiska-spiskov-5-prostykh-sposobov.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
