itertools: 無限イテレーターと有限イテレーター
count、cycle、islice、chain、zip_longest を使います。
「itertools: 無限イテレーターと有限イテレーター」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
itertoolsとは
itertoolsは、メモリ効率のよいイテレーター構築用の部品を提供する標準ライブラリモジュールです。すべての関数はリストではなくイテレーターを返します。
import itertools
# count: infinite counter
for i in itertools.islice(itertools.count(10, 2), 5):
print(i, end=" ") # 10 12 14 16 18count()
count(start, step)は、無限に続く等差数列を生成します。必ずisliceまたは終了条件と組み合わせてください。
import itertools
for n in itertools.count(1, 10):
if n > 40:
break
print(n, end=" ") # 1 11 21 31 41cycle()
cycle(iterable)は、イテラブルを無限に繰り返します。
import itertools
colors = itertools.cycle(["red","green","blue"])
for _ in range(7):
print(next(colors), end=" ")
# red green blue red green blue redrepeat()
repeat(value, times)は、同じ値をtimes回生成します(省略すると無限に生成します)。
import itertools
print(list(itertools.repeat(42, 4))) # [42, 42, 42, 42]
print(list(map(pow, range(5), itertools.repeat(2))))
# [0, 1, 4, 9, 16]islice()
islice(it, stop)またはislice(it, start, stop, step)は、イテレーターを実体化せずにスライスします。
import itertools
result = list(itertools.islice(range(100), 2, 10, 2))
print(result) # [2, 4, 6, 8]chain()
chain(*iterables)は、複数のイテラブルを末尾から順に連結し、1つのイテレーターにします。
import itertools
result = list(itertools.chain([1,2], [3,4], [5]))
print(result) # [1, 2, 3, 4, 5]
# chain.from_iterable for a list of iterables:
nested = [[1,2],[3,4]]
print(list(itertools.chain.from_iterable(nested)))zip_longest()
zip_longestは、長さの異なるイテラブルをまとめ、不足する値をfillvalueで補います。
import itertools
a = [1, 2, 3]
b = ["a", "b"]
print(list(itertools.zip_longest(a, b, fillvalue=0)))
# [(1, "a"), (2, "b"), (3, 0)]dropwhile()とtakewhile()
takewhile(pred, it)は、述語が真である間、要素を生成します。dropwhileはその逆の動作をします。
import itertools
nums = [1, 3, 5, 6, 7, 9]
print(list(itertools.takewhile(lambda x: x % 2, nums)))
# [1, 3, 5]
print(list(itertools.dropwhile(lambda x: x % 2, nums)))
# [6, 7, 9]filterfalse()
filterfalse(pred, it)は、述語がFalseになる要素を生成します。filter()の補集合に相当します。
import itertools
evens = list(itertools.filterfalse(lambda x: x%2, range(10)))
print(evens) # [0, 2, 4, 6, 8]starmap()
starmap(func, iterable)は、イテラブルから取り出した引数のタプルごとに関数を適用します。
import itertools, operator
pairs = [(2,3),(4,5),(1,10)]
result = list(itertools.starmap(operator.mul, pairs))
print(result) # [6, 20, 10]groupby()
groupby(it, key)は、キーの値が同じ連続する要素をグループ化します。正しくグループ化するには、事前にイテラブルをソートしてください。
import itertools
data = sorted([("a",1),("b",2),("a",3)], key=lambda x:x[0])
for key, group in itertools.groupby(data, key=lambda x:x[0]):
print(key, list(group))クイックチェック
itertools.chain([1,2], [3,4])は何を生成しますか。
まとめ
itertoolsは、無限イテレーター(count、cycle、repeat)、スライス(islice)、連結(chain、zip_longest)、フィルタリング(takewhile、dropwhile、filterfalse)を提供します。いずれも遅延評価され、メモリ効率に優れています。
よくある質問
「itertools: 無限イテレーターと有限イテレーター」レッスンは無料ですか?
はい。「itertools: 無限イテレーターと有限イテレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「itertools: 無限イテレーターと有限イテレーター」で何を学びますか?
count、cycle、islice、chain、zip_longest を使います。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「itertools: 無限イテレーターと有限イテレーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- itertools: 無限イテレーターと有限イテレーター
- itertools: 組合せ論
- functools: partial と reduce
- functools: lru_cache と cached_property