【发布时间】:2014-06-24 21:10:08
【问题描述】:
假设我有一个单一列表[[1,2,3],[4,5,6]]
我如何将它们转置为:[[1, 4], [2, 5], [3, 6]]?
我必须使用zip 函数吗? zip 函数是最简单的方法吗?
def m_transpose(m):
trans = zip(m)
return trans
【问题讨论】:
标签: python list matrix add transpose
假设我有一个单一列表[[1,2,3],[4,5,6]]
我如何将它们转置为:[[1, 4], [2, 5], [3, 6]]?
我必须使用zip 函数吗? zip 函数是最简单的方法吗?
def m_transpose(m):
trans = zip(m)
return trans
【问题讨论】:
标签: python list matrix add transpose
使用zip 和*splat 是纯Python 中最简单的方法。
>>> list_ = [[1,2,3],[4,5,6]]
>>> zip(*list_)
[(1, 4), (2, 5), (3, 6)]
请注意,您得到的是元组而不是列表。如果您需要这些列表,请使用map(list, zip(*l))。
如果您愿意使用 numpy 而不是列表列表,那么使用 .T 属性会更容易:
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> print(*a)
[1 2 3] [4 5 6]
>>> print(*a.T)
[1 4] [2 5] [3 6]
【讨论】:
使用zip()并得到你想要的确切方法是:
>>> l = [[1,2,3],[4,5,6]]
>>> [list(x) for x in zip(*l)]
>>> [[1, 4], [2, 5], [3, 6]]
此代码使用list 关键字将zip 返回的tuples 转换为lists。
【讨论】:
您可以使用map 和None 作为第一个参数:
>>> li=[[1,2,3],[4,5,6]]
>>> map(None, *li)
[(1, 4), (2, 5), (3, 6)]
与 zip 不同,它适用于不均匀的列表:
>>> li=[[1,2,3],[4,5,6,7]]
>>> map(None, *li)
[(1, 4), (2, 5), (3, 6), (None, 7)]
>>> zip(*li)
[(1, 4), (2, 5), (3, 6)]
# ^^ 7 missing...
如果您希望子元素是列表而不是元组,则以list 作为第一个参数再次调用 map:
>>> map(list, map(None, *li))
[[1, 4], [2, 5], [3, 6]]
(注意:在 Python 3.x 中不支持使用带有 None 的 map 来转置矩阵。使用 itertools 中的 zip_longest 来获得相同的功能...)
【讨论】:
zip() 似乎没有做你想做的事,使用zip() 你会得到list 的tuples。不过这应该可行:
>>> new_list = []
>>> old_list = [[1,2,3],[4,5,6]]
>>> for index in range(len(old_list[0])):
... new_list.append([old_list[0][index], old_list[1][index]])
...
>>> new_list
[[1, 4], [2, 5], [3, 6]]
【讨论】: