A Guide to Python Itertools (日本語)

accumulate()

itertools.accumulate(iterable)

この関数は、関数の結果を返すイテレータを作成します。 関数は変数と同じように渡すことができます。 accumulate() 関数は、引数として関数を受け取ります。 また、イテレート可能な変数も受け取ります。 この関数は、蓄積された結果を返します。 結果はそれ自体がイテレート可能なものに含まれます。 これは非常にわかりにくいと思うかもしれません。

コード

data = result = itertools.accumulate(data, operator.mul)
for each in result:
print(each)

出力

1
2
6
24
120

operator.mulは2つの数値を受け取り、それらを乗算します。

operator.mul(1, 2)
2
operator.mul(2, 3)
6
operator.mul(6, 4)
24
operator.mul(24, 5)
120

次の例では、maxの関数を使用します。

コード

data = result = itertools.accumulate(data, max)
for each in result:
print(each)

出力

5
5
6
6
6
9
9

max 関数は、最大のアイテムを返します。

5
max(5, 2)
5
max(5, 6)
6
max(6, 4)
6
max(6, 5)
6
max(6, 9)
9
max(9, 1)
9

関数の指定は任意です。

コード

data = result = itertools.accumulate(data)
for each in result:
print(each)

出力

5
7
13
17
22
31
32

関数が指定されていない場合、項目は合計されます。

5
5 + 2 = 7
7 + 6 = 13
13 + 4 = 17
17 + 5 = 22
22 + 9 = 31
31 + 1 = 32

combinations()

itertools.combinations(iterable, r)

この関数はiterableと整数を受け取ります。

コード

shapes = result = itertools.combinations(shapes, 2)for each in result:
print(each)

このコードでは、メンバーが2人のコンボをすべて作ります。

Output

('circle', 'triangle')
('circle', 'square')
('triangle', 'square')

Code

shapes = result = itertools.combinations(shapes, 3)for each in result:
print(each)

このコードでは、3人のメンバーですべてのコンボを作ります。

Output

('circle', 'triangle', 'square')

combinations_with_replacement()

itertools.combinations_with_replacement(iterable, r)

こちらはcombinations()関数と同じですが、こちらは個々の要素を2回以上繰り返すことができます。

コード

shapes = result = itertools.combinations_with_replacement(shapes, 2)
for each in result:
print(each)

出力

('circle', 'circle')
('circle', 'triangle')
('circle', 'square')
('triangle', 'triangle')
('triangle', 'square')
('square', 'square')

count()

itertools.count(start=0, step=1)

数字のstartから始まる等間隔の値を返すイテレータを作成します。

コード

for i in itertools.count(10,3):
print(i)
if i > 20:
break

上記のコードでは、関数を反復したりループしたりしています。

出力

10
13
16
19
22

この最初の繰り返しでは、値が10になります。 次のステップでは、3を加算します。 次の繰り返しでも同じことをして、値は16になります。

cycle()

itertools.cycle(iterable)

この関数はイテレータを無限に循環させます。

コード

colors = for color in itertools.cycle(colors):
print(color)

上記のコードでは、リストを作成します。 そして、このリストを延々と循環させています。 通常、forcycle()という関数を使えば違います。

出力

red
orange
yellow
green
blue
indigo
violet
red
orange
yellow
green
...

上記の果てしない出力を楕円で切り捨てました。

chain()

itertools.chain(*iterables)

この関数は一連のイテレートを受け取り、それらを1つの長いイテレートとして返します。

コード

colors = 
shapes = result = itertools.chain(colors, shapes)
for each in result:
print(each)

出力

red
orange
yellow
green
blue
circle
triangle
square
pentagon

compress()

itertools.compress(data, selectors)

この関数は、1つのイテレートを別のイテレートでフィルタリングします。

コード

shapes = 
selections = result = itertools.compress(shapes, selections)
for each in result:
print(each)

出力

circle
square

dropwhile()

itertools.dropwhile(predicate, iterable)

述語が真である限り、iterableから要素を削除するイテレータを作成します。 その後、すべての要素を返します。

コード

data = result = itertools.dropwhile(lambda x: x<5, data)
for each in result:
print(each)

出力

5
6
7
8
9
10
1

わかりました。 これは紛らわしいですね。 コードでは、アイテムが5未満の間、各アイテムをドロップするようになっています。 5未満ではないアイテムに遭遇した後、残りのアイテムを返します。

Step Through It

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, return surviving items

filterfalse()

itertools.filterfalse(predicate, iterable)

この関数は、iterableから要素をフィルタリングして、述語がFalseであるものだけを返すイテレータを作ります。

Code

data = 
result = itertools.filterfalse(lambda x: x<5, data)
for each in result:
print(each)

Output

5
6
7
8
9
10

Step Through It

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, keep
6 < 5: False, keep
7 < 5: False, keep
8 < 5: False, keep
9 < 5: False, keep
10 < 5: False, keep

groupby()

itertools.groupby(iterable, key=None)

簡単に言うと。 この関数は、物事をグループ化します。 OKです。 これは複雑ですね。 そして、例は少し長いです。

コード

robots = for key, group in itertools.groupby(bots, key=lambda x: x):
print(key)
print(list(group))

出力

autobot

decepticon

islice()

itertools.islice(iterable, start, stop)

この関数はスライスと非常によく似ています。 この関数を使うと、反復可能なものの一部を切り取ることができます。

コード

colors = 
few_colors = itertools.islice(colors, 2)
for each in few_colors:
print(each)

アウトプット

red
orange

permutations()

itertools.permutations(iterable, r=None)

コード

alpha_data = result = itertools.permutations(alpha_data)
for each in result:
print(each)

Output

('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

product()

この関数は一連のイテレートからカルテシアンプロダクトを作成します。

コード

num_data = 
alpha_data = result = itertools.product(num_data, alpha_data)
for each in result:
print(each)

出力

(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')

次のような表を想像してください。

 a b c
1 a1 b1 c1
2 a2 b2 c3
3 a3 b3 b3

repeat()

itertools.repeat(object)

この関数は、あるオブジェクトを何度も繰り返します。

コード

for i in itertools.repeat("spam"):
print(i)

上記のコードでは、spamを何度も繰り返すだけのイテレートを作成しています。 これを無限に行います。

Output

spam
spam
spam
spam
spam
spam
...

上記の無限の出力を楕円で切り捨てました。

コード

for i in itertools.repeat("spam", 3):
print(i)

引数にtimesを使えば、繰り返す回数を制限することができます。

出力

spam
spam
spam

この例では、spamは3回しか繰り返しません。

starmap()

itertools.starmap(function, iterable)

この関数は、イテレートから得られた引数を使って関数を計算するイテレータを作ります。 では、早速見てみましょう。

コード

data = 
result = itertools.starmap(operator.mul, data)
for each in result:
print(each)

アウトプット

12
32
21

ステップスルー

operator.mul(2, 6)
12
operator.mul(8, 4)
32
operator.mul(7, 3)
21

takewhile()

itertools.takwwhile(predicate, iterable)

これは、dropwhile()の逆のようなものです。 この関数は、イテレータを作成し、述語が真である限り、イテレート可能な要素を返します。

コード

data = result = itertools.takewhile(lambda x: x<5, data)
for each in result:
print(each)

出力

1
2
3
4

Step Through It

1 < 5: True, keep going
2 < 5: True, keep going
3 < 5: True, keep going
4 < 5: True, keep going
5 < 5: False, stop and drop

tee()

itertools.tee(iterable, n=2)

1つのイテレートからn個の独立したイテレータを返します。

コード

colors = 
alpha_colors, beta_colors = itertools.tee(colors)for each in alpha_colors:
print(each)print('..')for each in beta_colors:
print(each)

デフォルトは2ですが、必要な数だけ作ることができます。

出力

red
orange
yellow
green
blue
..
red
orange
yellow
green
blue

zip_longest()

itertools.zip_longest(*iterables, fillvalue=None)

この関数は、それぞれのイテレータから要素を集約したイテレータを作成します。 各イテレータの長さが不揃いの場合、足りない値はfillvalueで埋められます。

Code

colors = 
data = for each in itertools.zip_longest(colors, data, fillvalue=None):
print(each)

Output

('red', 1)
('orange', 2)
('yellow', 3)
('green', 4)
('blue', 5)
(None, 6)
(None, 7)
(None, 8)
(None, 9)
(None, 10)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です