+ 20

# 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]?

41 Answers

+ 24

#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):]], []))

+ 14

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)

+ 9

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

+ 8

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

+ 8

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

+ 5

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

+ 5

That will fill _ into the list, ππ’π’ππ¨ ππ‘ππ²ππ₯.
Sure, you can filter after that, but you're then losing elegance.

+ 5

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?

+ 5

Not elegant but the most efficient and readable I could find.
https://code.sololearn.com/c501xOJcSnQY/?ref=app
[Edit] 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

ππ’π’ππ¨ ππ‘ππ²ππ₯, 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

Quick way,elegant way
Just Define a merge function
lst1 = [0,1,2,3]
lst2 = [4,5,6]
def mergeList(a,b):
return a + b
fulLst = mergeList(lst1,lst2)
print(fulLst)

+ 4

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

+ 3

ππ’π’ππ¨ ππ‘ππ²ππ₯ Sami Khan
my lists are not equal length π

+ 3

ππ’π’ππ¨ ππ‘ππ²ππ₯
I remember a long zip in itertoolsπ€π€
cant remember but that woukd make your zip variant perfect

+ 3

ππ’π’ππ¨ ππ‘ππ²ππ₯ not so bad!

+ 3

This might be a bit late but....pip jnstall "more-itertools" then :-
import more_itertools
list1 = [1, 3, 5, 7]
list2 = [2, 4, 6, 8]
print(list(more_itertools.roundrobin(list1, list2)))
output = [1, 2, 3, 4, 5, 6, 7, 8]

Hot today

I have made a calculator in which my % (Percentage) not work correctly for 100%50 or 100%20.

2 Votes

Python palindrome challenge.

1 Votes

Java

0 Votes

Number of Ones ( C++ ) question!

1 Votes