 Merge 2 lists in python | SoloLearn: Learn to code for FREE!

+16

# Merge 2 lists in python

Is there an elegant way to [0,1,2,3], [4,5,6] - >[0,4,1,5,2,6,3]?

+18

#Oneliner a = [0,1,2,3,5,6] b = [4,5,6] print(sum([[i, j] for i, j in zip(a, b)] + [a[len(b):]] or [b[len(a):]], []))

+9

This would be an inelegant way I suppose... a, b = [0, 1, 2, 3, 4], [5, 6, 7] c = [] for i in range(min((len(a), len(b)))): c.append(a[i]) c.append(b[i]) c.extend(a[i+1:] or b[i+1]) print(c)

+7

Yeah, the efficiency problem remains: We create stuff we don't want.

+6

What mean is: When you look at it, you should feel like damn, THAT'S how you do it, why didn't I think of that?

+6

I think this is most pythonic: [x for x in chain.from_iterable(zip_longest(a, b)) if x is not None] I also have another solution with pop() that consumes the original lists. https://code.sololearn.com/ctGh1XLDz1nt/?ref=app

+5

𝐊𝐢𝐢𝐛𝐨 𝐆𝐡𝐚𝐲𝐚𝐥 Sami Khan my lists are not equal length 😒

+5

There's itertools.zip_longest, which fills up the shorter iterables with None.

+5

Oma Falk HonFu like this 👇 import itertools a=[0,1,2,3] b=[4,5,6] print(list(itertools.zip_longest(a,b, fillvalue ='_' ))) Output : [(0, 4), (1, 5), (2, 6), (3, '_')]

+5

That will fill _ into the list, 𝐊𝐢𝐢𝐛𝐨 𝐆𝐡𝐚𝐲𝐚𝐥. Sure, you can filter after that, but you're then losing elegance.

+5

Oma Falk Done import itertools a=[0,1,2,3] b=[4,5,6] print(list(itertools.zip_longest(a,b))) output : [(0, 4), (1, 5), (2, 6), (3, None)]

+5

Hello are we on planet earth 👽 https://code.sololearn.com/cXiKi3ovUxTm/?ref=app Oma Falk

+5

Not elegant but the most efficient and readable I could find. https://code.sololearn.com/c501xOJcSnQY/?ref=app  Oma Falk #len(l2) >= len(l1) res = [n for x in zip(l1,l2) for n in x] + l2[len(l1):] I found the way to flatten a tuple here: https://stackoverflow.com/questions/3204245/how-do-i-convert-a-tuple-of-tuples-to-a-one-dimensional-list-using-list-comprehe

+4

But how do you get to the *end* result?

+4

Yeah, as I said, list full of Nones.

+4

Oma Falk HonFu Done import itertools a=[0,1,2,3] b=[4,5,6] print([k for k in [j for i in (itertools.zip_longest(a,b)) for j in i] if k is not None ]) Output : [0, 4, 1, 5, 2, 6, 3]

+4

𝐊𝐢𝐢𝐛𝐨 𝐆𝐡𝐚𝐲𝐚𝐥, I mean, your version creates a list that has Nones in them, but then we make another list where we take the Nones out.

+4

a = [0,1,2,3] b = [4,5,6] c = a + b c[1:len(b)*2:2] = b c[:len(b)*2+1:2] = a[:len(b)+1] print(c) # Put bigger list in "a" and smaller list in"b"

+4

Speed comparison between different known methods mentioned in this thread: https://code.sololearn.com/c39kIttuOIgd/?ref=app

+4

not very elegant, but there's this... print(sum(list(zip(a+b,b+a)), ())[0:len(a+b)])

+3

𝐊𝐢𝐢𝐛𝐨 𝐆𝐡𝐚𝐲𝐚𝐥 I remember a long zip in itertools🤔🤔 cant remember but that woukd make your zip variant perfect