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()展開は要注意

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら