2012-10-22 3 views
11

Каков наилучший способ суммировать два или более списков, даже если они имеют разную длину?Списки сумм различной длины

Например, у меня есть:

lists = [[1, 2], [0, 3, 4], [5]] 

и результат должен быть:

result = [6, 5, 4] 
+0

'Задача для самого pythonic-способа по-прежнему открыта'' - что в этом нетрадиционное отношение к' izip_longest'? –

+1

Ничего, это просто открытый вопрос, без единого правильного ответа. Вопрос состоял в том, чтобы собрать несколько способов выполнения задачи, чтобы изучить новые методы решения проблемы. –

+0

Это не тот вопрос, который подходит для stackoverflow. Вероятно, вас пометят «неконструктивно». –

ответ

18

Вы можете использовать itertools.izip_longest() и использовать fillvalue равное 0

In [6]: [sum(x) for x in itertools.izip_longest(*lists, fillvalue=0)] 
Out[6]: [6, 5, 4] 

для Python < 2.6:

In [27]: ml = max(map(len, lists)) 

In [28]: ml  #length of the longest list in lists 
Out[28]: 3 

In [29]: [sum(x) for x in zip(*map(lambda x:x+[0]*ml if len(x)<ml else x, lists))] 
Out[29]: [6, 5, 4] 
+1

(при условии, что пользователь не застрял с Python <2.6) –

0

Лучшее, что я придумал следующий:

result = [sum(filter(None, i)) for i in map(None, *lists)] 

Это не так уж плохо, но я должен добавить NoneTypes, а затем фильтровать их, чтобы подвести итоги.

Смежные вопросы