あなたが探しているのは、実際にはmultiset (またはbag ) であり、必ずしも異なる要素のコレクションではありません (セットには重複は含まれません)。
ここにマルチセットの実装があります: https://github.com/mlenzen/collections-extended (Pypy のコレクション拡張モジュール)。
マルチセットのデータ構造は と呼ばれbag
ます。Aはモジュールからのクラスbag
のサブクラスであり、要素の多様性を追跡するための追加の辞書があります。Set
collections
class _basebag(Set):
"""
Base class for bag and frozenbag. Is not mutable and not hashable, so there's
no reason to use this instead of either bag or frozenbag.
"""
# Basic object methods
def __init__(self, iterable=None):
"""Create a new basebag.
If iterable isn't given, is None or is empty then the bag starts empty.
Otherwise each element from iterable will be added to the bag
however many times it appears.
This runs in O(len(iterable))
"""
self._dict = dict()
self._size = 0
if iterable:
if isinstance(iterable, _basebag):
for elem, count in iterable._dict.items():
self._inc(elem, count)
else:
for value in iterable:
self._inc(value)
bag
isの優れたメソッドnlargest
(for リストと同様Counter
) は、各要素の出現回数がバッグの辞書で最新に保たれているため、すべての要素の多重度を非常に高速に返します。
>>> b=bag(random.choice(string.ascii_letters) for x in xrange(10))
>>> b.nlargest()
[('p', 2), ('A', 1), ('d', 1), ('m', 1), ('J', 1), ('M', 1), ('l', 1), ('n', 1), ('W', 1)]
>>> Counter(b)
Counter({'p': 2, 'A': 1, 'd': 1, 'm': 1, 'J': 1, 'M': 1, 'l': 1, 'n': 1, 'W': 1})