- 順次呼び出しの実装である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)
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(条件が合い続ける限りまで取る)とかが比較的頻用しそう