Python モジュール: itertools

  • 階乗、順列や組み合わせ、直積を簡単に扱えるモジュール

モジュールの読み込み

import itertools

順列

  • 階乗のイテレータ (list でリストに変換できる) を作成する
    VAR = list(itertools.permutations(SEQ))
    • VAR: 階乗のパターンを格納する変数
    • SEQ: 階乗で使われる数のリスト (リストの長さが階乗 $N!$ の $N$ になる)
    • パターン数を求める場合は、list の長さを調べると良い。
      • 例: 5! のパターン数
        variable = len(list(itertools.permutations(range(5))))    # 120
      • 例: 3! (ただし、10, 11, 12 のパターンを作成)
        variable = list(itertools.permutations([10,11,12]))
        # [(10, 11, 12), (10, 12, 11), (11, 10, 12), (11, 12, 10), (12, 10, 11), (12, 11, 10)]

順列

  • 順列のイテレータ (list でリストに変換できる) を作成する
    VAR = list(itertools.permutations(SEQ, R))
    • VAR: 順列のパターンを格納する変数
    • SEQ: リストの長さが ${}_n \mathrm{P}_r$ の ${}_n$ になる。
    • R: ${}_n \mathrm{P}_r$ の ${}_r$
    • 例: ${}_5 \mathrm{P}_3$
      variable = len(list(itertools.permutations(range(5), 3)))    # 60

組み合わせ

  • 組み合わせ (順列の順序なし) のイテレータ (list でリストに変換できる) を作成する
    VAR = list(itertools.combinations(SEQ, R))
    • VAR: 組み合わせのパターンを格納する変数
    • SEQ: リストの長さが ${}_n \mathrm{C}_r$ の ${}_n$ になる。
    • R: ${}_n \mathrm{C}_r$ の ${}_r$
    • 例: ${}_5 \mathrm{C}_3$
      variable = len(list(itertools.combinations(range(5), 3)))    # 10

直積

  • 2 つの集合体の組み合わせである直積 ($A \times B$) のイテレーターを作成する
    VAR = list(itertools.product(SEQ_A, SEQ_B))
    • VAR: 直積のパターンを格納する変数
    • SEQ_A: 集合 A
    • SEQ_A: 集合 B
    • 返り値は、組み合わせパターンの 2 変数
    • 例:
      list_a = [1,2,3]
      list_b = [4,5]
      variable = len(list(itertools.product(list_a, list_b)))
      # [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
      for i,j in itertools.product(list_a, list_b):
          print(i, j)
      # 1 4
      # 1 5
      # 2 4
      # 2 5
      # 3 4
      # 3 5