如何在python中将二维数组的列转换为行?

时间:2015-12-09 23:46:41

标签: python python-2.7 multidimensional-array

我有一个二维python数组,如下所示:

A = [[186,192,133],[12],[122,193,154],[166,188,199],[133,44,23,56,78,96,100]]

现在我如何创建一个看起来像这样的新数组?

B = [[186,12,122,166,133],[192, 193,188,44],[133,154,199,23],[56],[78],[96],[100]]

我基本上想将A列转换为B行。

3 个答案:

答案 0 :(得分:1)

解决方案

from itertools import izip_longest # in Python 3 zip_longest

list([x for x in y if x is not None] for y in izip_longest(*A))

结果:

[[186, 12, 122, 166, 133],
 [192, 193, 188, 44],
 [133, 154, 199, 23],
 [56],
 [78],
 [96],
 [100]]

说明

izip_longest给你一个迭代器:

>>> from itertools import izip_longest
>>> izip_longest([1, 2, 3], [4, 5])
<itertools.izip_longest at 0x103331890>

将其转换为列表以查看其功能:

>>> list(izip_longest([1, 2, 3], [4, 5]))
[(1, 4), (2, 5), (3, None)]

它从每个列表中获取一个元素并将它们成对地放入元组中。此外,它使用None(或您提供的其他值)填充缺失值。

*允许为函数提供未指定数量的参数。例如,我们可以将两个列表放在另一个列表中并使用*,它仍然可以正常工作:

>>> list(izip_longest(*[[1, 2, 3], [4, 5]]))
[(1, 4), (2, 5), (3, None)]

这不仅限于两个论点。一个例子有三个。

单个参数:

>>> list(izip_longest([1, 2, 3], [4, 5], [6]))
[(1, 4, 6), (2, 5, None), (3, None, None)]

一个列表中包含*的所有参数:

>>> list(izip_longest(*[[1, 2, 3], [4, 5], [6]]))
[(1, 4, 6), (2, 5, None), (3, None, None)]

您不需要None值。使用列表解析过滤掉它们:

>>> [x for x in y if x is not None] 

对于A,你可以得到:

>>> list(izip_longest(*A))
[(186, 12, 122, 166, 133),
 (192, None, 193, 188, 44),
 (133, None, 154, 199, 23),
 (None, None, None, None, 56),
 (None, None, None, None, 78),
 (None, None, None, None, 96),
 (None, None, None, None, 100)]

现在,y会遍历此列表中的所有条目,例如(186, 12, 122, 166, 133)。虽然x遍历y中的每个单独号码,例如186。外[]创建一个列表。而不是元组(186, 12, 122, 166, 133) 我们得到一个列表[186, 12, 122, 166, 133]。最后,if x is not None会过滤掉None值。

答案 1 :(得分:1)

使用mapfilter转换的另一种方法:

A = [[186, 192, 133], [12], [122, 193, 154], [166, 188, 199], [133, 44, 23, 56, 78, 96, 100]]


print([list(filter(None,sub)) for sub in map(None,*A)])
[[186, 12, 122, 166, 133], [192, 193, 188, 44], [133, 154, 199, 23], [56], [78], [96], [100]]

如果0是潜在的,您需要专门检查无':

print([list(filter(lambda x: x is not None, sub)) for sub in map(None,*A)])

或者根据Mikes答案使用常规列表comp进行映射:

 [[x for x in sub if x is not None] for sub in map(None,*A)]

答案 2 :(得分:0)

    def rotate(A):
        B = []
        added = True
        while added:
            added = False
            col = []
            for row in A:
                try:
                    col.append(row.pop(0))
                except IndexError:
                    continue
                added = True
            col and B.append(col)
        return B