2015-04-08 3 views
1

У меня есть список списков строк, подобных этому:конкатенации столбцов в двумерном массиве

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] 

Но, конечно, есть лучший способ?

+0

['itertools.zip_longest'] (https://docs.python.org/3/library/itertools.html#itertools.zip_longest)? – jonrsharpe

ответ

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.

+0

Обратите внимание, что это просто 'zip_longest' в 3.x (поскольку основной' zip' теперь является итератором). – jonrsharpe

+0

Спасибо, я пропустил тэг 3.x (ответ обновлен). –