[[itertools][組み合わせ][順列]itertoolsを使ってみる

  • 順次呼び出しの実装であるiteratorをほかの言語ですてきに(メモリを抑えて、とか)実装してあるのをpythonの特徴に合わせて作ったもの、とのこと(こちら)
  • itertoolsをインストールする。コンソールにて
sudo easy_install itertools # 列挙・組み合わせ関連のライブラリ
import itertools as it
  • 大きく分けて3つに分類できる
    • 無限列の発生
    • 引数の長さが違うときに最も短いものに合わせて処理する色々
    • 組み合わせ系
  • 組み合わせ系は、以下の4つ
    • 重複あり順列(product)、重複なし順列(permutations)、重複なし組み合わせ(combinations)、重複あり組み合わせ(combinations_with_replacement)
cpr = it.product('ABCD', repeat=2)
cpm = it.permutations('ABCD', 2)
ccb = it.combinations('ABCD', 2)
ccr = it.combinations_with_replacement('ABCD', 2)
tmp = []
for element in cpr:
	tmp.append((element))

tmp
>>> tmp
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'C'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C'), ('D', 'D')]
tmp = []
for element in cpm:
	tmp.append((element))

tmp
>>> tmp
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')]
tmp = []
for element in ccb:
	tmp.append((element))

tmp
>>> tmp
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
tmp = []
for element in ccr:
	tmp.append((element))

tmp
>>> tmp
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'C'), ('C', 'D'), ('D', 'D')]
  • 無限列
    • 等間隔無限数列(count)、ぐるぐる繰り返し(cycle)、要素の(指定回数)繰り返し(repeat)
ict= it.count(10,3)
icc = it.cycle([2,4,6])
irp = it.repeat(3) # it.repeat(3,10)とすれば3の10回繰り返し(有限列)ができる
tmp = []
i = 0 # 取り出しの打ち切りを制御するため
for element in ict:
	tmp.append((element))
	if i == 6: break
	i += 1

tmp
>>> tmp
[10, 13, 16, 19, 22, 25, 28]
tmp = []
i = 0
for element in icc:
	tmp.append((element))
	if i == 6: break
	i += 1

tmp
>>> tmp
[2, 4, 6, 2, 4, 6, 2]
tmp = []
i = 0
for element in irp:
	tmp.append((element))
	if i == 6: break
	i += 1

tmp
>>> tmp
[3, 3, 3, 3, 3, 3, 3]
  • 引数の長さが違うときに短い方に合わせて処理する色々
    • 条件の付け方が色々なので、itertoolsのページを参照
    • izip (2つのリストをペアワイズで組み合わせる)とか、takewhile(条件が合い続ける限りまで取る)とかが比較的頻用しそう