序文
PythonのItertoolsライブラリがPythonの宝石と見なされていることをご存知ですか?一部のユーザーは、これを最もクールで最もすばらしいPythonライブラリの1つとさえ考えています。 Itertoolsモジュールを使用して、アプリケーションを充実させ、信頼性の高い実用的なソリューションを短時間で作成できます。
この記事は、読者がプロジェクトでItertoolsモジュールを使用する方法を理解するのに役立ちます。
この記事は3つのパートに分かれており、各パートでItertoolsライブラリの特定の機能について説明します。具体的には:
コンセプト紹介
イテレーターとは
イテレーターは、__ next__メソッドで構成されるオブジェクトです。ステータスがあります。状態は、反復中の実行を記憶するために使用されます。したがって、イテレータは現在の状態を認識しているため、メモリ効率が高くなります。これが、メモリ効率が高く高速なアプリケーションでイテレータが使用される理由です。
無制限のデータストリーム(ファイルの読み取りなど)を開いて、次のアイテム(ファイルの次の行など)を取得できます。次に、プロジェクトで操作を実行して、次のプロジェクトに進むことができます。これは、現在のアイテムを知る必要があるだけなので、無限の数の要素を返すイテレーターを持つことができることを意味する場合があります。
次に返すアイテムがない場合、イテレーターはStopIteration例外を発生させます。
反復可能とは何ですか?
Iterableは、イテレーターを返すことができるオブジェクトです。イテレーターを返す__iter__メソッドがあります。 Iterableは、ループしてiter()を呼び出すことができるオブジェクトでもあります。 __getitem__メソッドがあり、0から始まる連続したインデックスを取得できます(インデックスが無効になるとIndexErrorが発生します)。
Itertoolsとは
ItertoolsはPythonモジュールであり、Python3標準ライブラリの一部です。これにより、イテレーターで効率的なメモリおよび計算タスクを実行できます。これは、APL、Haskell、およびSMLの構築に触発されています。
基本的に、このモジュールには、純粋なPythonで簡潔かつ効率的にアプリケーションを構築するのに役立つ、高速でメモリ効率の高いメソッドが多数含まれています。
無限イテレーター
無限に等間隔の値を返すイテレーターを作成する場合はどうなりますか?または、イテレーターから要素ループを生成する必要がある場合はどうなりますか?または、イテレーターの要素を繰り返したい場合はどうなりますか?
itertoolsライブラリは、必要なすべての機能を実行するために使用できる一連の機能を提供します。
このセクションにリストされている3つの関数は、アイテムの無限のストリームになる可能性のあるイテレーターを作成して返します。
Count
例として、等距離の値の無限のシーケンスを生成できます。
start =10
stop =1
my_counter = it.count(start, stop)for i in my_counter:
# this loop will run for ever
print(i)
結果:
101112131415
Cycle
サイクルメソッドを使用して、入力から要素の無限ループを生成できます。
このメソッドの入力は、リスト、文字列、辞書などの反復可能なオブジェクトである必要があります。
my_cycle = it.cycle('Python')for i in my_cycle:print(i)
結果:
P
y
t
h
o
n
P
y
t
h
o
n
P
Repeat
アイテム(文字列やコレクションなど)を繰り返すには、repeat()関数を使用できます。
to_repeat ='FM'
how_many_times =4
my_repeater = it.repeat(to_repeat, how_many_times)for i in my_repeater:print(i)
# Prints
FM
FM
FM
FM
これにより、文字列「FM」が4回繰り返されます。 2番目のパラメーターを指定しない場合、この文字列が無期限に繰り返されます。
イテレーターを終了します
このセクションでは、終了反復の強力な機能について説明します。これらの関数は、次のような多くのシナリオで使用できます。
Chain
このメソッドを使用すると、要素がなくなるまで、シーケンスの入力反復ですべての要素を返すイテレーターを作成できます。したがって、連続シーケンスを単一シーケンスとして扱うことができます。
chain = it.chain([1,2,3],['a','b','c'],['End'])for i in chain:print(i)
結果
123
a
b
c
End
Drop While
iterableと条件を渡すことができます。このメソッドは、条件が要素に対してFalseを返すまで、各要素の条件の計算を開始します。要素の条件値がFalseになると、関数は残りの反復可能な要素を返します。
たとえば、ジョブリストがあり、要素を繰り返し処理して、条件が満たされない場合にのみ要素を返したいとします。条件の値がFalseになると、イテレーターの残りの要素が返されることを期待しています。
jobs =['job1','job2','job3','job10','job4','job5']
dropwhile = it.dropwhile(lambda x :len(x)==4, jobs)for i in dropwhile:print(i)
結果:
job10
job4
job5
このメソッドは、要素job10の長さが4文字に等しくないため、上記の3つの項目を返します。したがって、job10およびその他の要素が返されます。
Take While
このメソッドは、dropwhile()メソッドの反対です。基本的に、最初の条件がFalseを返すまで、iterableのすべての要素を返し、その後、他の要素を返しません。
たとえば、ジョブリストがあり、条件が満たされない場合はすぐにジョブに戻るのを停止したいとします。
jobs =['job1','job2','job3','job10','job4','job5']
takewhile = it.takewhile(lambda x :len(x)==4, jobs)for i in takewhile:print(i)
結果:
job1
job2
job3
GroupBy
この関数は、反復可能な連続する要素をグループ化した後、反復子を構築します。この関数は、キーと値のペアのイテレーターを返します。ここで、キーはグループキーであり、値はキーによってグループ化された連続する要素のコレクションです。
次のコードスニペットについて考えてみます。
iterable ='FFFAARRHHHAADDMMAAALLIIKKK'
my_groupby = it.groupby(iterable)for key, group in my_groupby:print('Key:', key)print('Group:',list(group))
group属性は反復可能であるため、リストとして具体化します。
したがって、これは印刷されます:
Key: F
Group:[‘F’, ‘F’, ‘F’]
Key: A
Group:[‘A’, ‘A’]
Key: R
Group:[‘R’, ‘R’]
Key: H
Group:[‘H’, ‘H’, ‘H’]
Key: A
Group:[‘A’, ‘A’]
Key: D
Group:[‘D’, ‘D’]
Key: M
Group:[‘M’, ‘M’]
Key: A
Group:[‘A’, ‘A’, ‘A’]
Key: L
Group:[‘L’, ‘L’]
Key: I
Group:[‘I’, ‘I’]
Key: K
Group:[‘K’, ‘K’, ‘K’]
Tee
このメソッドは、反復を分割し、入力から新しい反復を生成できます。出力はイテレーターでもあり、指定された数のアイテムのイテラブル値を返します。それをよりよく理解するために、次のコードスニペットを参照してください。
iterable ='FM'
tee = it.tee(iterable,5)for i in tee:print(list(i))
このメソッドは、反復可能なFM全体を5回返します。
[ ‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’]
コンビネーションイテレーター
Permutations
置換メソッドを使用することにより、入力イテラブル内の要素の連続配置を返すイテレータを作成できます。
配置の長さを指定するパラメーターを渡すことができます。デフォルトでは、iterableの長さになります。
これは、長さが欠落している場合、メソッドがすべての可能な完全長の順列を生成することを意味します。
iterable ='FM1'
length =2
permutations = it.permutations(iterable, length)for i in permutations:print(i)
結果
( ‘F’, ‘M’, ‘1’)(‘F’, ‘1’, ‘M’)(‘M’, ‘F’, ‘1’)(‘M’, ‘1’, ‘F’)(‘1’, ‘F’, ‘M’)(‘1’, ‘M’, ‘F’)
長さが2の場合、次のように生成されます。
( ‘F’, ‘M’)(‘F’, ‘1’)(‘M’, ‘F’)(‘M’, ‘1’)(‘1’, ‘F’)(‘1’, ‘M’)(‘F’, ‘M’)(‘F’, ‘1’)(‘M’, ‘1’)
Combinations
最後に、反復可能オブジェクトの組み合わせを生成する方法について説明します。
イテレーターが与えられると、与えられた長さの要素のサブシーケンスを返すイテレーターを構築できます。
それらの位置に応じて、要素は一意であると見なされ、異なる要素のみが返されます。
iterable ='FM1'
combinations = it.combinations(iterable,2)for i in combinations:print(i)
結果
( ‘F’, ‘M’)(‘F’, ‘1’)(‘M’, ‘1’)
·END·
Recommended Posts