0Pricing
Python Academy · レッスン

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 18

count()

count(start, step)は、無限に続く等差数列を生成します。必ずisliceまたは終了条件と組み合わせてください。

import itertools

for n in itertools.count(1, 10):
    if n > 40:
        break
    print(n, end=" ")  # 1 11 21 31 41

cycle()

cycle(iterable)は、イテラブルを無限に繰り返します。

import itertools

colors = itertools.cycle(["red","green","blue"])
for _ in range(7):
    print(next(colors), end=" ")
# red green blue red green blue red

repeat()

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. itertools: 無限イテレーターと有限イテレーター
  2. itertools: 組合せ論
  3. functools: partial と reduce
  4. functools: lru_cache と cached_property
← Python Academyに戻る