1. ホーム
  2. python

[解決済み] itertoolsのchainとchain.from_iterableの違いは何ですか?

2023-07-26 15:47:14

質問

インターネット上で、両者の違いや、どちらかを選択する理由がわかるような有効な例が見つかりません。

どのように解決するのですか?

前者は0個以上の引数を取り、それぞれが反復記号となります。後者は1個の引数を取り、反復記号を生成することが期待されます。

from itertools import chain

chain(list1, list2, list3)

iterables = [list1, list2, list3]
chain.from_iterable(iterables)

しかし iterables はイテラブルを生成する任意のイテレータにすることができます。

def gen_iterables():
    for i in range(10):
        yield range(i)

itertools.chain.from_iterable(gen_iterables())

2番目の形式を使うのは通常便利な場合ですが、これは入力の反復記号を遅延してループするので 無限 数の有限反復子を連鎖させることができる唯一の方法です。

def gen_iterables():
    while True:
        for i in range(5, 10):
            yield range(i)

chain.from_iterable(gen_iterables())

上記の例では、決して止まることのない循環的な数字のパターンを生成する反復処理可能なものが得られますが、単一の range() の呼び出しが必要とする以上のメモリを消費することはありません。