+ 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 Respostas
+ 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]