交換 Python 列表類型的二維數組的行和列

商業

標準的 Python 列表類型可以通過列表的列表來表示二維數組。

本節說明如何交換這個二維數組的行和列。

    1. 轉換為 NumPy 數組
    2. .T用這個轉置。
    1. pandas.DataFrame轉換成這個
    2. .T用這個轉置。
  • 使用內置函數 zip() 轉置

使用 NumPy 或 pandas 更容易,但如果您不想僅導入 NumPy 或 pandas 進行轉置,則可以使用 zip() 函數進行轉置。

原始二維數組定義如下

import numpy as np
import pandas as pd

l_2d = [[0, 1, 2], [3, 4, 5]]

轉換為 NumPy 數組 ndarray 並用 .T 轉置

從原始二維數組生成一個 NumPy 數組 ndarray 並得到帶有 .T 屬性的轉置對象。

如果最終想要一個 Python 列表類型的對象,請使用 tolist() 方法進一步將其轉換為列表。

arr_t = np.array(l_2d).T

print(arr_t)
print(type(arr_t))
# [[0 3]
#  [1 4]
#  [2 5]]
# <class 'numpy.ndarray'>

l_2d_t = np.array(l_2d).T.tolist()

print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>

除了 .T 屬性之外,還可以使用 ndarray 方法 transpose() 和函數 numpy.transpose() 。

轉換為 pandas.DataFrame 並用 .T 轉置

從原始二維數組生成pandas.DataFrame,得到轉置後的對象,帶有.T屬性。

如果你最後想要一個 Python 列表類型的對象,獲取帶有 values 屬性的 numpy.ndarray,然後使用 tolist() 方法將其轉換為列表。

df_t = pd.DataFrame(l_2d).T

print(df_t)
print(type(df_t))
#    0  1
# 0  0  3
# 1  1  4
# 2  2  5
# <class 'pandas.core.frame.DataFrame'>

l_2d_t = pd.DataFrame(l_2d).T.values.tolist()

print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>

使用內置函數 zip() 轉置

使用內置函數 zip() 轉置二維數組。

zip() 是一個返回迭代器的函數,該迭代器總結了多個可迭代對象(列表、元組等)的元素。例如,在 for 循環中運行多個列表時使用它。

此外,該函數使用一種機制,如果函數參數標有星號,則可以擴展和傳遞列表。

可以如下進行轉置。

l_2d_t_tuple = list(zip(*l_2d))

print(l_2d_t_tuple)
print(type(l_2d_t_tuple))
# [(0, 3), (1, 4), (2, 5)]
# <class 'list'>

print(l_2d_t_tuple[0])
print(type(l_2d_t_tuple[0]))
# (0, 3)
# <class 'tuple'>

事實上,裡面的元素是元組。因此,如果要使其成為列表,請使用 list(),它將元組轉換為列表理解表示法中的列表。

l_2d_t = [list(x) for x in zip(*l_2d)]

print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>

print(l_2d_t[0])
print(type(l_2d_t[0]))
# [0, 3]
# <class 'list'>

以下是該過程的分步細分。

列表的元素用星號展開,展開的元素用 zip() 函數組合在一起,然後用列表理解符號將元組轉換為列表。

print(*l_2d)
# [0, 1, 2] [3, 4, 5]

print(list(zip([0, 1, 2], [3, 4, 5])))
# [(0, 3), (1, 4), (2, 5)]

print([list(x) for x in [(0, 3), (1, 4), (2, 5)]])
# [[0, 3], [1, 4], [2, 5]]