Python 標準ライブラリのcollections.Counter
クラスは、セット内の同じ要素の複数の出現を許可するタイプであるマルチセットを実装します。
パイソンの種類
マルチセット カウンターは本質的に辞書であり、キーは特定の要素を表し、値は要素の出現数、つまりコレクション全体における要素の数を表します。
>>> from collections import Counter
>>> issubclass(Counter, dict)
True
辞書とは異なり、Counter はキーが存在しない場合でもエラーを報告しません。
>>> c = Counter()
>>> c['x']
0
キーが存在しない場合、要素数は当然0になります。
新しいビルド
Counter([iterable-or-mapping])
反復可能なオブジェクトから初期要素を取得することに加えて、Counter を辞書として作成することもできます (キーと値のペアの値は要素の数です)。
# 可迭代对象
>>> c_1 = Counter("xy")
>>> c_1
Counter({
'x': 1, 'y': 1})
# 以下均为以字典的方式创建 Counter
# 'x' 和 'y' 均有 2 个
>>> c_2 = Counter({
'x': 2, 'y': 2})
>>> c_2
Counter({
'x': 2, 'y': 2})
>>> c_3 = Counter(x=3, y=3)
>>> c_3
Counter({
'x': 3, 'y': 3})
# 2-tuple
>>> c_4 = Counter([('x', 4), ('y', 4)])
>>> c_4
Counter({
('x', 4): 1, ('y', 4): 1})
操作する
- 加減
+
と-
の動作規則は次のとおりです。
- 要素の数を加算および減算します。
- 正の数を持つ要素のみを保持する
操作結果は新しい Counter オブジェクトを返します。
# 'x' 和 'y' 的计数都 +2
>>> c_1 + c_2
Counter({
'x': 3, 'y': 3})
# 'x' 和 'y' 的计数不变, 'z' 的计数 +1
>>> c_1 + Counter('z')
Counter({
'x': 1, 'y': 1, 'z': 1})
# 'z' 的计数为 -1(舍弃)
>>> c_1 - Counter('z')
Counter({
'x': 1, 'y': 1})
# 'x' 和 'y' 的计数均为 -1(均舍弃)
>>> c_1 - c_2
Counter()
+
AND演算に加えて-
、Counter は加算および減算演算のインスタンス メソッドも提供します。
- 引き算
c.subtract([iterable-or-mapping])
- 添加
c.update([iterable-or-mapping])
加算演算子や減算演算子subtract
とは異なり、update
どちらもカウントが 0 以下の要素を保持し、c 自体を変更します。
>>> c_1.subtract(c_2)
>>> c_1
Counter({
'x': -1, 'y': -1})
# 'x' 个数 +2
>>> c_1.update('xx')
>>> c_1
Counter({
'x': 1, 'y': -1})
- 集合演算
マルチセットとして、当然セット操作をサポートします
- 交差点
両方のカウンタが持つ要素を選択し、要素数が小さい方の値を取る
- 連合
2 つのカウンターのすべての要素を選択します。要素の数は大きい方の値になります。
# 没有共同元素
>>> Counter('xy') & Counter('z')
Counter()
# 共同元素 'x', 个数取较小值 1
>>> Counter('xxy') & Counter('xz')
Counter({
'x': 1})
# 新集合包含 'x' 'y' 'z' 3 个元素
>>> Counter('xy') | Counter('z')
Counter({
'x': 1, 'y': 1, 'z': 1})
>>> Counter('xxy') | Counter('xz')
Counter({
'x': 2, 'y': 1, 'z': 1})
- その他の方法
c.elements()
すべての要素 (重複を含む) の反復可能c.most_common([n])
最大の番号を持つ最初の n 個の要素とその番号c.clear
空
>>> c = Counter('abbcccdddd')
>>> c
Counter({
'd': 4, 'c': 3, 'b': 2, 'a': 1})
>>> c.elements()
<itertools.chain object at 0x7ff1352bd400>
>>> list(c.elements())
['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd']
>>> c.most_common(2)
[('d', 4), ('c', 3)]
注:len(c)
非繰り返し要素の数を示します。要素の実数はsum(c.values())
orc.total()
(Python 3.10 でのみサポートされます)
>>> c
Counter({
'd': 4, 'c': 3, 'b': 2, 'a': 1})
>>> len(c)
4
>>> sum(c.values())
10