
このチュートリアルでは、Python のコレクション モジュールからカウンター オブジェクトを使用する方法を学習します。
Python で長いシーケンス (たとえば、Python のリストや文字列) を操作している場合、シーケンスに表示される項目とそれらの表示回数を保存する必要がある場合があります。
Python ディクショナリは、このようなアプリケーションに適した組み込みデータ構造です。 ただし、コレクション モジュールの Python の Counter クラスを使用すると、カウンターを構築することで、これを単純化できます。これは、アイテムとシーケンス内のカウントのディクショナリです。
次の数分間で、次のことを学びます。
- Python のカウンター オブジェクトを使用する
- iterable に項目のカウント値を格納するための Python 辞書を作成する
- 簡略化された構文で Python のカウンターを使用して辞書を書き換えます
- 要素の更新や減算、2 つのカウンター オブジェクト間の交点の検出などの操作を実行します。
- most_common() メソッドを使用して、カウンターで最も頻繁に使用されるアイテムを取得します
始めましょう!
Python コレクション モジュールとカウンター クラス
多くの場合、Python 辞書を使用して、アイテムとそのカウントを iterable に格納します。 アイテムとカウントは、それぞれキーと値として格納されます。
Counter クラスは Python の組み込みコレクション モジュールの一部であるため、次のように Python スクリプトにインポートできます。
from collections import Counter
前述のように Counter クラスをインポートした後、次のようにカウンター オブジェクトをインスタンス化できます。
<counter_object> = Counter(iterable)
ここ:
- iterable は、Python リスト、文字列、またはタプルなどの有効な Python 反復可能オブジェクトです。
- iterable 内のアイテムはハッシュ可能でなければなりません。
Counter を使用して任意の Python イテラブルからカウンター オブジェクトを作成する方法がわかったので、コーディングを開始しましょう。
このチュートリアルで使用される例は、この GitHub gist にあります。
Python Iterables からカウンター オブジェクトを作成する方法
「ルネッサンス」などの Python 文字列を作成し、それを単語と呼びましょう。
>>> word = "renaissance"
私たちの目標は、単語文字列の各文字が文字列内での出現回数にマッピングされる辞書を作成することです。 1 つのアプローチは、次のように for ループを使用することです。
>>> letter_count = {} >>> for letter in word: ... if letter not in letter_count: ... letter_count[letter] = 0 ... letter_count[letter] += 1 ... >>> letter_count {'r': 1, 'e': 2, 'n': 2, 'a': 2, 'i': 1, 's': 2, 'c': 1}
上記のコード スニペットの機能を解析してみましょう。
- letter_count を空の Python 辞書に初期化します。
- 単語文字列をループします。
- letter_count 辞書に文字が存在するかどうかを確認します。
- 文字が存在しない場合は、値 0 を追加してから、値を 1 ずつ増やします。
- word 内の文字が出現するたびに、toletter に対応する値が 1 ずつ増加します。
- これは、文字列全体をループするまで続きます。
文字列の単語をループする for ループを使用して、letter_count 辞書を独自に作成しました。
コレクションモジュールの Counter クラスを使ってみましょう。 文字列を Counter() に渡すだけで、 iterables をループせずに letter_count を取得できます。
>>> from collections import Counter >>> letter_count = Counter(word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1})
counter オブジェクトも Python ディクショナリです。 これを確認するには、組み込みの isinstance() 関数を使用できます。
>>> isinstance(letter_count,dict) True
ご覧のとおり、isinstance(letter_count, dict) は True を返し、カウンター オブジェクト letter_count が Python dict クラスのインスタンスであることを示します。
カウンター オブジェクトの変更
これまでのところ、Python 文字列からカウンター オブジェクトを作成する方法を学びました。
別の iterable からの要素でそれらを更新するか、それらから別の iterable を減算することによって、カウンター オブジェクトを変更することもできます。
別の Iterable の要素でカウンターを更新する
別の文字列 another_word を初期化しましょう:
>>> another_word = "effervescence"
letter_count カウンター オブジェクトを another_word 文字列の項目で更新したいとします。
カウンター オブジェクト letter_count で update() メソッドを使用できます。
>>> letter_count.update(another_word) >>> letter_count Counter({'e': 7, 'n': 3, 's': 3, 'c': 3, 'r': 2, 'a': 2, 'f': 2, 'i': 1, 'v': 1})
出力では、counter オブジェクトが更新され、another_word からの文字とその出現回数も含まれていることがわかります。
別の Iterable から要素を減算する
それでは、letter_count オブジェクトから another_word の値を引きます。 これを行うには、subtract() メソッドを使用できます。
letter_count から another_word を引きましょう。
>>> letter_count.subtract(another_word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1, 'f': 0, 'v': 0})
another_word の文字に対応する値が減算されていることがわかりますが、追加されたキー ‘f’ と ‘v’ は削除されていません。 これらは値 0 にマップされるようになりました。
注: ここでは、Python 文字列の another_word をsubtract() メソッド呼び出しに渡しています。 Python カウンター オブジェクトまたは別の iterable を渡すこともできます。
Python での 2 つのカウンター オブジェクト間の交差
2 つの Python カウンター オブジェクトの共通部分を見つけて、2 つのオブジェクト間でどのキーが共通しているかを特定したい場合があります。
another_word 文字列「effervescence」からカウンター オブジェクト、たとえば、letter_count_2 を作成しましょう。
>>> another_word = "effervescence" >>> letter_count_2 = Counter(another_word) >>> letter_count_2 Counter({'e': 5, 'f': 2, 'c': 2, 'r': 1, 'v': 1, 's': 1, 'n': 1})
簡単な & 演算子を使用して、letter_count と letter_count_2 の間の交点を見つけることができます。
>>> letter_count & letter_count_2 Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
2 つの単語に共通するキーと出現回数を取得する方法に注目してください。 「ルネッサンス」と「発泡」の両方に、「e」が 2 回出現し、「r」、「n」、「s」、および「c」がそれぞれ 1 回出現します。
most_common を使用して最も頻繁に使用される項目を見つける
Python カウンター オブジェクトに対するもう 1 つの一般的な操作は、最も頻繁に発生する項目を見つけることです。
カウンターで最も一般的な上位 k 個のアイテムを取得するには、カウンター オブジェクトで most_common() メソッドを使用できます。 ここでは、letter_count で most_common() を呼び出して、最も頻繁に出現する 3 つの文字を見つけます。
>>> letter_count.most_common(3) [('e', 2), ('n', 2), ('a', 2)]
文字「e」、「n」、および「a」が「ルネッサンス」という単語に 2 回出現することがわかります。
これは、カウンターに多数のエントリが含まれていて、最も一般的なキーを操作することに関心がある場合に特に役立ちます。
結論
チュートリアルで学んだことの簡単なレビューは次のとおりです。
- Python の組み込みコレクション モジュールの Counter クラスを使用して、イテラブル内のすべてのアイテムのカウント値の辞書を取得できます。 iterable 内のすべてのアイテムがハッシュ可能であることを確認する必要があります。
- 次の構文で update() メソッドを使用して、1 つの Python カウンター オブジェクトの内容を別のカウンター オブジェクトまたはその他の iterable の内容で更新できます。 counter2 の代わりに任意の iterable を使用できることに注意してください。
- 更新されたカウンターから iterable の 1 つの内容を削除したい場合は、subtract() メソッドを使用できます: counter1.subtract(counter2)。
- 2 つのカウンター オブジェクト間の共通要素を見つけるには、& 演算子を使用できます。 2 つのカウンター counter1 と counter2 を指定すると、counter1 & counter2 は、これら 2 つのカウンター オブジェクトの共通部分を返します。
- カウンターで最も頻繁に使用される k 個のアイテムを取得するには、most_common() メソッドを使用できます。 counter.most_common(k) は、k 個の最も一般的な項目とそれぞれの数を示します。
次に、コレクション モジュールの別のクラスである default dict の使用方法を学びます。 不足しているキーを処理するために、通常の Python 辞書の代わりにデフォルトの辞書を使用できます。