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

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

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

Содержание

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

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

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

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

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

  • Использование списочного включения для транспонирования списков в 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, которая делает работу с числовыми операциями невероятно простой! Numpy поставляется с различными типами объектов, один из которых - массив numpy. Эти массивы имеют много общего со списками Python, но также позволяют выполнять ряд полезных математических операций.

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

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

# Транспонирование списка списков в 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 с помощью 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 с помощью 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 с помощью циклов 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 с помощью списочного включения

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, ознакомьтесь с официальной документацией здесь

Last updated