Python itertools.permutations()とは?順列を生成する方法
Pythonのitertools.permutations()は、要素を並べ替えたパターン(順列)をすべて生成する関数です。
並べる順番の違いを区別するのが特徴で、「ABとBAは別物」として数えます。
itertools.permutations()の基本的な使い方
from itertools import permutations
print(list(permutations("ABC")))
実行結果:
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
3つの要素の並べ方6通りがすべて出ました。第2引数を省略すると全要素を使います。
取り出す個数を指定する
from itertools import permutations
print(list(permutations("ABC", 2)))
実行結果:
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
3つから2つを選んで並べる、6通りです。('A','B')と('B','A')が両方入っている点に注目してください。これが順列です。
件数を計算で確かめる
from itertools import permutations
import math
print(len(list(permutations("ABCD", 2))), math.perm(4, 2))
print(len(list(permutations("ABCD"))), math.factorial(4))
実行結果:
12 12
24 24
n個からr個を選ぶ順列の数はmath.perm(n, r)、全要素ならmath.factorial(n)と一致します。件数だけ知りたいなら生成せずにmath.perm()を使ってください。
rが要素数より大きいと空になる
from itertools import permutations
print(list(permutations("AB", 3)))
実行結果:
[]
2個しかないものから3個は選べないため、エラーではなく空のまま返ります。「結果が出ない」ときはここを疑ってください。
重複する要素は区別されない
知らないとハマる仕様です。
from itertools import permutations
print(list(permutations("AAB", 2)))
実行結果:
[('A', 'A'), ('A', 'B'), ('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'A')]
('A','A')が2回出ました。permutations()は値ではなく位置で並べ替えるため、1文字目のAと2文字目のAを別物として扱います。
重複をなくしたいときはset()にしてください。
print(sorted(set(permutations("AAB", 2))))
実行結果:
[('A', 'A'), ('A', 'B'), ('B', 'A')]
結果はタプルで返る
文字列として扱いたいときはjoin()します。
from itertools import permutations
print(["".join(p) for p in permutations("ABC")])
実行結果:
['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA']
件数の爆発に注意
| 要素数 | 全順列の数 |
|---|---|
| 5 | 120 |
| 8 | 40,320 |
| 10 | 3,628,800 |
| 13 | 6,227,020,800 |
階乗なので急激に増えます。permutations()自体はイテレータなので瞬時に返りますが、list()で展開した瞬間にメモリを使い切ります。10要素を超えるなら、全列挙ではなく別のアルゴリズムを検討してください。
combinations()との違い
from itertools import permutations, combinations
print("permutations:", list(permutations("ABC", 2)))
print("combinations:", list(combinations("ABC", 2)))
実行結果:
permutations: [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
combinations: [('A', 'B'), ('A', 'C'), ('B', 'C')]
| 関数 | 順序の違い | 意味 |
|---|---|---|
permutations() |
区別する | 並べる(席順・暗証番号) |
combinations() |
区別しない | 選ぶ(チーム分け・くじ) |
「順番に意味があるか」で選んでください。組み合わせについては「Python itertools.combinations()とは?組み合わせを生成する方法」で解説しています。
itertools.permutations()のまとめ
permutations(iterable, r)は順列をすべて生成する- 順序の違いを区別する(ABとBAは別)
- rを省略すると全要素、rが大きすぎると空
- 重複する要素は区別されない。
set()で除去する - 件数だけなら
math.perm()・math.factorial() - 階乗で爆発するので
list()展開は要注意



