我想重新组织列表中的二维列表元素(这里有两个元素):
[[['A','B','C'],
['G','H','I']],
[['D','E','F'],
['J','K','L']]]
成为:
[['A','B','C','D','E','F'],
['G','H','I','J','K','L']]
有没有更好的方法来写这个,而不是以下函数表示的那个?
def joinTableColumns(tableColumns):
"""
fun([[['A','B','C'],
['G','H','I'] ],
[['D','E','F'],
['J', 'K', 'L']]]) --> [['A', 'B', 'C', 'D', 'E', 'F'],
['G', 'H', 'I', 'J', 'K', 'L']]
"""
tableData = []
for i,tcol in enumerate(tableColumns):
for j,line in enumerate(tcol):
if i == 0:
tableData.append(line)
else:
tableData[j]+=line
return tableData
考虑到要加入的行数相等:
tdim_test = [(len(x), [len(y) for y in x][0] )for x in tableData]
len(list(set([x[0] for x in tdim_test])))==1
如何提高该功能的稳健性?或者,我应该使用标准库中的某些内容吗?
答案 0 :(得分:1)
是的,您可以在列表理解中使用zip()
函数和itertools.chain()
:
In [17]: lst = [[['A','B','C'],
['G','H','I']],
[['D','E','F'],
['J','K','L']]]
In [18]: from itertools import chain
In [19]: [list(chain.from_iterable(i)) for i in zip(*lst)]
Out[19]: [['A', 'B', 'C', 'D', 'E', 'F'], ['G', 'H', 'I', 'J', 'K', 'L']]
或者作为一种纯粹的功能方法,您可以使用itertools.starmap()
和operator.add()
:
In [22]: from itertools import starmap
In [23]: from operator import add
In [24]: list(starmap(add, zip(*lst)))
Out[24]: [['A', 'B', 'C', 'D', 'E', 'F'], ['G', 'H', 'I', 'J', 'K', 'L']]
答案 1 :(得分:1)
import functools
[ functools.reduce(lambda x,y: x + y, i,[]) for i in zip(*matrix)]
这会给你你想要的东西
答案 2 :(得分:0)
您可以使用zip
函数,在其中解压缩表并添加对:
table = [[['A','B','C'], ['G','H','I']],
[['D','E','F'], ['J','K','L']]]
res = [t1 + t2 for t1, t2 in zip(*table)]
产生你想要的结果:
[['A', 'B', 'C', 'D', 'E', 'F'], ['G', 'H', 'I', 'J', 'K', 'L']]