Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging/adding lists in Python

Tags:

python

list

I'm pretty sure there should be a more Pythonic way of doing this - but I can't think of one: How can I merge a two-dimensional list into a one-dimensional list? Sort of like zip/map but with more than two iterators.

Example - I have the following list:

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

I want to have

result = [12, 15, 18] # [1+4+7, 2+5+8, 3+6+9] 

So far what I've come up with is:

def add_list(array):     number_items = len(array[0])     result = [0] * number_items     for index in range(number_items):         for line in array:             result[index] += line[index]     return result 

But that doesn't look very elegant/Pythonic to me. Aside from not checking if all the "lines" in the 2D array are of the same length, can be added to each other, etc. What would be a better way to do it?

like image 744
Tim Pietzcker Avatar asked Nov 04 '08 21:11

Tim Pietzcker


People also ask

Can two lists be added in Python?

There are several ways to join, or concatenate, two or more lists in Python. One of the easiest ways are by using the + operator.

How do you join 3 lists in Python?

Using + operator The + operator does a straight forward job of joining the lists together. We just apply the operator between the name of the lists and the final result is stored in the bigger list. The sequence of the elements in the lists are preserved.

How do you concatenate multiple lists in Python?

You can concatenate multiple lists into one list by using the * operator. For Example, [*list1, *list2] – concatenates the items in list1 and list2 and creates a new resultant list object. Usecase: You can use this method when you want to concatenate multiple lists into a single list in one shot.

How do I merge nested lists in Python?

First, flatten the nested lists. Take Intersection using filter() and save it to 'lst3'. Now find elements either not in lst1 or in lst2, and save them to 'temp'. Finally, append 'temp' to 'lst3'.


2 Answers

[sum(a) for a in zip(*array)] 
like image 121
Ned Batchelder Avatar answered Sep 22 '22 08:09

Ned Batchelder


[sum(value) for value in zip(*array)] is pretty standard.

This might help you understand it:

In [1]: array=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]  In [2]: array Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  In [3]: *array ------------------------------------------------------------    File "<ipython console>", line 1      *array      ^ <type 'exceptions.SyntaxError'>: invalid syntax 

The unary star is not an operator by itself. It unwraps array elements into arguments into function calls.

In [4]: zip(*array) Out[4]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

zip() is a built-in function

In [5]: zip(*array)[0] Out[5]: (1, 4, 7) 

each element for the list returned by zip is a set of numbers you want.

In [6]: sum(zip(*array)[0]) Out[6]: 12  In [7]: [sum(values) for values in zip(*array)] Out[7]: [12, 15, 18] 
like image 20
Charles Merriam Avatar answered Sep 21 '22 08:09

Charles Merriam