在列表

时间:2017-02-17 13:10:37

标签: arrays python-3.x multiple-columns

我想重新组织列表中的二维列表元素(这里有两个元素):

[[['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

如何提高该功能的稳健性?或者,我应该使用标准库中的某些内容吗?

3 个答案:

答案 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']]