Pythonで要素数が異なる複数のリストからインデックス順に要素を取り出して一次元リストを作成する

l1 = ['1', '2', '3', '4']
l2 = ['a', 'b', 'c']
l3 = ['あ', 'い', 'う', 'え', 'お']

という複数のリストをこんなふうにまとめたい。

['1', 'a', 'あ', '2', 'b', 'い', '3', 'c', 'う', '4', 'え', 'お']

サンプルコード

from itertools import chain, zip_longest

l1 = ['1', '2', '3', '4']
l2 = ['a', 'b', 'c']
l3 = ['あ', 'い', 'う', 'え', 'お']

# itertools.chain()を使う場合
ls = [i for i in chain(*zip_longest(l1, l2, l3)) if i]
print(ls)
# ['1', 'a', 'あ', '2', 'b', 'い', '3', 'c', 'う', '4', 'え', 'お']

# itertools.chain.from_iterable()を使う場合
ls = [i for i in chain.from_iterable(zip_longest(l1, l2, l3)) if i]

# sum()を使う場合
ls = [i for i in sum(zip_longest(l1, l2, l3),()) if i]

# for文をネストする場合
ls = [j for i in zip_longest(l1, l2, l3) for j in i if j]
  1. itertools.zip_longest()で転置する
    • 不足の要素を補うのでzip()ではなくitertools.zip_longest()を使う
  2. それぞれの方法で平坦化する
  3. 補った要素(None)を内包表記のif句で除外する

環境

参考