交换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]]