python merge two lists (even/odd elements)
Question: Given two lists, I want to merge them so that all elements from the first list
are even-indexed (preserving their order) and all elements from second list
are odd-indexed (also preserving their order). Example below:

    
    
    x = [0,1,2]
    y = [3,4]
    
    result = [0,3,1,4,2]
    

I can do it using for loop. But I guess there could be a fancy pythonic way of
doing this (using a less-known function or something like that). Is there any
better solution that writing a for-loop?

edit: I was thinking about list comprehensions, but didn't come up with any
solution so far.


Answer: Here's something you can use. (Use `list(izip_longest(...))` for Py2x)

    
    
    >>> from itertools import chain
    >>> from itertools import zip_longest
    >>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = ''))))
    [0, 3, 1, 4, 2]
    

This works for arbitrary length lists like follows -

    
    
    >>> x = [0, 1, 2, 3, 4]
    >>> y = [5, 6]
    >>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = ''))))
    [0, 5, 1, 6, 2, 3, 4]
    

**Explanation on it's working** \-

  1. `zip_longest(...)` with a fill value zips the lists and fills in the given fill value for iterables of unequal length. So, for your original example, it evaluates to something like `[(0, 3), (1, 4), (2, '')]`
  2. We need to flatten the result because this method gives us a list of tuples. For that we use `chain.from_iterable(...)` giving us something like `[0, 3, 1, 4, 2, '']`.
  3. We now use `filter(...)` to remove all occurences of `''` and we get the required answer.

