これを試すことができます:
In [30]: from itertools import izip_longest
In [31]: l = ['a', 'b']
In [32]: l2 = [1, 2, 3, 4]
In [33]: [item for slist in izip_longest(l, l2) for item in slist if item is not None]
Out[33]: ['a', 1, 'b', 2, 3, 4]
izip_longest
2 つのリストを一緒に「圧縮」しますが、最短のリストの長さで停止するのではなく、最長のリストが使い果たされるまで続けます。
In [36]: list(izip_longest(l, l2))
Out[36]: [('a', 1), ('b', 2), (None, 3), (None, 4)]
次に、圧縮されたリスト内の各ペアの各アイテムを反復処理してアイテムを追加し、値が のアイテムを省略しますNone
。@Blckknight で指摘されているように、元のリストにNone
既に値がある場合、これは正しく機能しません。あなたの状況でそれが可能な場合は、のfillvalue
プロパティを使用して、izip_longest
以外のもので埋めることができますNone
(@Blckknightが彼の答えで行っているように)。
上記の例を関数として次に示します。
In [37]: def interleave(*iterables):
....: return [item for slist in izip_longest(*iterables) for item in slist if item is not None]
....:
In [38]: interleave(l, l2)
Out[38]: ['a', 1, 'b', 2, 3, 4]
In [39]: interleave(l, l2, [44, 56, 77])
Out[39]: ['a', 1, 44, 'b', 2, 56, 3, 77, 4]