我有一个二维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行。
答案 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)
使用map
和filter
转换的另一种方法:
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