连接二维数组中的列

时间:2015-04-08 13:21:06

标签: python python-3.x

我有一个与此类似的字符串列表列表:

arr = [['a', 'b', 'c'],
       ['X', 'Y', 'Z'],
       ['1', '2', '3'],
      ]

我需要将其转换为连接的“列”列表,即:

['aX1', 'bY2', 'cZ3']

我提出了将整个阵列顺时针旋转90度的解决方案,然后以相反的顺序连接每行中的所有项目:

[''.join(reversed(row)) for row in zip(*reversed(arr))]

只要每行具有相同数量的项目,就可以正常工作。但是如果不是这样的话怎么办呢。假设我有一个这样的数组:

arr = [['a', 'b', 'c', 'd'],
       ['X', 'Y'],
       ['1', '2', '3'],
      ]

我期待的是:

['aX1', 'bY2', 'c3', 'd']

在使用上述解决方案之前,我可以用空字符串项填充较短的行:

max_item_count = max(len(row) for row in arr)
arr = [row + [''] * (max_item_count - len(row)) for row in arr]

但肯定有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

如果您有不同长度的列表,则可以使用允许指定填充值的zip_longest

>>> from itertools import zip_longest
>>> arr = [['a', 'b', 'c', 'd'], ['X', 'Y'], ['1', '2', '3']]
>>> [''.join(x) for x in zip_longest(*arr, fillvalue='')]  
['aX1', 'bY2', 'c3', 'd']

使用此填充值填充较短的列表,直到最长列表的长度。

在Python 2中,该函数名为izip_longest