「リストの全組み合わせを作りたい」「複数のリストを1本につなげたい」。こんな処理を for 文のネストで書いていませんか?標準ライブラリの itertools を使えば、短く読みやすく書けます。
この記事では、itertools の中でも特によく使う chain・islice・permutations・combinations・product・groupby・accumulate を、実行結果つきで初心者向けに解説します。
itertoolsとは?
itertools は、繰り返し処理(イテレータ)を便利に扱う関数がそろったモジュールです。メモリを節約しながら処理できるのも特徴です。イテレータの仕組みはジェネレータとyieldの記事を読んでおくと理解しやすくなります。
chain:複数のリストを連結する
from itertools import chain
a = [1, 2]
b = [3, 4]
c = ["x", "y"]
print(list(chain(a, b, c)))
# [1, 2, 3, 4, 'x', 'y']count・cycle と islice:無限に続く列から取り出す
from itertools import count, cycle, islice
print(list(islice(count(1), 5)))
# [1, 2, 3, 4, 5]
print(list(islice(cycle("AB"), 5)))
# ['A', 'B', 'A', 'B', 'A']count は 1, 2, 3, … と無限に数え続け、cycle は同じ並びを繰り返し続けます。islice で「最初の5個だけ」のように取り出すのが定番の使い方です。
permutations:順列を作る
from itertools import permutations
for p in permutations([1, 2, 3], 2):
print(p)
# (1, 2)
# (1, 3)
# (2, 1)
# (2, 3)
# (3, 1)
# (3, 2)順番が違えば別物として数える組み合わせ(順列)です。3つから2つ選ぶので6通りになります。
combinations:組み合わせを作る
from itertools import combinations
for cmb in combinations("ABC", 2):
print(cmb)
# ('A', 'B')
# ('A', 'C')
# ('B', 'C')順番を区別しない組み合わせです。「3人から2人を選ぶ」のように、チーム分けやペア作りで活躍します。
このあたりの処理は、競技プログラミングやIT系の資格・試験対策でもよく登場します。学習計画に迷ったら、Python3エンジニア認定基礎試験のおすすめ参考書比較も参考にしてみてください。
product:直積(全部の組み合わせ)
from itertools import product
for x in product([1, 2], "ab"):
print(x)
# (1, 'a')
# (1, 'b')
# (2, 'a')
# (2, 'b')for 文を2重にしたのと同じ結果が、1行で書けます。
groupby:同じキーでまとめる
from itertools import groupby
words = ["apple", "avocado", "banana", "blueberry", "cherry"]
for key, group in groupby(words, key=lambda w: w[0]):
print(key, list(group))
# a ['apple', 'avocado']
# b ['banana', 'blueberry']
# c ['cherry']groupby は「隣り合った同じキー」をまとめるので、事前に sorted で並べ替えておく必要があります。lambda や sorted の使い方は、lambda式とsortとsortedの記事をご覧ください。
accumulate:途中経過つきの合計
from itertools import accumulate
print(list(accumulate([1, 2, 3, 4])))
# [1, 3, 6, 10]累積和(途中までの合計)を作れます。売上の推移や、歩数の累計などの計算に便利です。
もっと効率的にPythonを学びたい人へ
itertools のような標準ライブラリを使いこなすと、コードがぐっと短くなります。自分のコードが効率的か見てもらいたい方は、マンツーマンで学べるスクールを検討してみてください。
Winスクールの「Python Winner」は、マンツーマン指導で未経験からPythonを学べ、転職サポートや無料カウンセリングにも対応しています。まずは無料カウンセリングで、自分に合うか確かめてみてはいかがでしょうか。
※本記事には広告(アフィリエイトリンク)を含みます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
他のスクールとも比べたい方は、スクールの比較記事もあわせてご覧ください。資格取得を目指す方はPython3エンジニア認定基礎試験の参考書比較も参考になります。
まとめ
- chain は複数のリストを1本につなぐ
- count・cycle は無限に続く列を作り、islice で必要な分だけ取り出す
- permutations は順列、combinations は組み合わせ、product は直積
- groupby は事前に sorted してから使う
- accumulate は途中経過つきの合計(累積和)を作る
まずは combinations で、身近なものの組み合わせを列挙してみましょう。
ナノトイラボ 
