34

How do i merge [['a','b','c'],['d','e','f']] to ['a','b','c','d','e','f']?

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
thclpr
  • 5,778
  • 10
  • 54
  • 87
  • from functools import reduce a = [['a','b','c'],['d','e','f']] reduce(lambda x, y: x+y, a) – Mohan Feb 01 '20 at 16:51
  • import itertools original_list = [[2,4,3],[1,5,6], [9], [7,9,0]] new_merged_list = list(itertools.chain(*original_list)) – javasundaram Aug 22 '20 at 17:40

6 Answers6

40

Using list comprehension:

ar = [['a','b','c'],['d','e','f']]
concat_list = [j for i in ar for j in i]
Ketouem
  • 3,820
  • 1
  • 19
  • 29
21

list concatenation is just done with the + operator.

so

total = []
for i in [['a','b','c'],['d','e','f']]:
    total += i

print total
will
  • 10,260
  • 6
  • 46
  • 69
  • This is the best solution, as it's the simplest. +1. However, you can simply do: `new_list = old_list1 + old_list2`. Your's does the same thing, but you don't need to put them together in a list of lists first. – Rushy Panchal Jan 11 '13 at 13:12
  • Yeah, I just wanted it to work for an arbitrary list. I've since learnt you can do something like `sum([], [list1, list2, list3])`, and since sum calls the + operator, which for `[]` is the concatenation op, it will join them all for you. – will Mar 14 '17 at 23:49
  • @will Fully agree with you. ```total += i``` is a more generic solution. – Sophia Oct 16 '22 at 18:29
8

This would do:

a = [['a','b','c'],['d','e','f']]
reduce(lambda x,y:x+y,a)
Sibi
  • 47,472
  • 16
  • 95
  • 163
  • WHY?! this is completely over the top, why not just do `a = [['a','b','c'],['d','e','f']]` `a[0]+a[1]` – will Jan 11 '13 at 13:00
  • Will that work if the list was `[['a','b','c'],['d','e','f'],['d','e','f']] ? – Sibi Jan 11 '13 at 13:01
  • obviously not, but that is not what the question was, and if you want it to work for arbitrarily long sets of flat lists, then [my answer](http://stackoverflow.com/a/14278710/432913) works and is much more readable – will Jan 11 '13 at 13:02
  • 2
    I agree your answer is much more readable :), I just gave an generic answer. :) – Sibi Jan 11 '13 at 13:03
  • Apart from being slow(coz of `lambda`) this code will easily break if `a` is something like : `[('a','b','c'),['d','e','f']]`. – Ashwini Chaudhary Jan 11 '13 at 13:06
  • @Sibi - I normally dislike lambdas - i find they're a very easy way to make very unreadable code. This example i quite like for it's succinctness though – will Jan 11 '13 at 13:06
  • @AshwiniChaudhary Ofcourse, that code wasn't written to concatenate list and tuple ;) – Sibi Jan 11 '13 at 13:08
  • 1
    @AshwiniChaudhary - I don't see how this is relevant - if you pass the wrong arguments to a function, you're going to get a bad answer... – will Jan 11 '13 at 13:09
  • @AshwiniChaudhary If you really want to make that code work, then you can do this for your case: `reduce(lambda x,y:list(x)+list(y),a)` – Sibi Jan 11 '13 at 13:10
  • 2
    @Sibi Why not simply use `itertools.chain()`, which is built for such for such purpose only and is very fast compared to your solution. http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python#408281 – Ashwini Chaudhary Jan 11 '13 at 13:16
5

Try:

sum([['a','b','c'], ['d','e','f']], [])

Or longer but faster:

[i for l in [['a', 'b', 'c'], ['d', 'e', 'f']] for i in l]

Or use itertools.chain as @AshwiniChaudhary suggested:

list(itertools.chain(*[['a', 'b', 'c'], ['d', 'e', 'f']]))
Hui Zheng
  • 10,084
  • 2
  • 35
  • 40
  • 6
    `sum()` shouldn't be used for such things. As [docs](http://docs.python.org/2/library/functions.html#sum) say: **To concatenate a series of iterables, consider using itertools.chain().** – Ashwini Chaudhary Jan 11 '13 at 13:03
1

Try the "extend" method of a list object:

 >>> res = []
 >>> for list_to_extend in range(0, 10), range(10, 20):
         res.extend(list_to_extend)
 >>> res
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Or shorter:

>>> res = []
>>> map(res.extend, ([1, 2, 3], [4, 5, 6]))
>>> res
[1, 2, 3, 4, 5, 6]
Kiwisauce
  • 1,229
  • 8
  • 7
0
mergedlist = list_letters[0] + list_letters[1]

This assumes you have a list of a static length and you always want to merge the first two

>>> list_letters=[['a','b'],['c','d']]
>>> list_letters[0]+list_letters[1]
['a', 'b', 'c', 'd']
Harpal
  • 12,057
  • 18
  • 61
  • 74