sec*_*ded 6 python dictionary python-3.x
我希望能够执行以下操作:
foo = Counter(['bar', 'shoo', 'bar'])
tmp = {}
tmp[foo] = 5
Run Code Online (Sandbox Code Playgroud)
换句话说,是否有一个可哈希的等价物Counter?请注意,我无法使用,frozenset因为我有重复的元素要保留在密钥中。
编辑: 在我的实际应用中, foo 中的对象可能无法相互比较,因此无法对列表进行排序。
您似乎需要一种使用无序键数量对作为键的方法。Afrozenset可能是要走的路,尽管您必须从 theitems而Counter不是它的中创建它keys。
foo = Counter(['bar', 'shoo', 'bar'])
tmp = {}
tmp[frozenset(foo.items())] = 5
# tmp: {frozenset({('bar', 2), ('shoo', 1)}): 5}
Run Code Online (Sandbox Code Playgroud)
如果这令人满意,您可以通过定义自己的映射类型来实现此转换,如下所示:
from collections import Counter
class CounterDict:
def __init__(self):
self.data = {}
def __setitem__(self, key, value):
if isinstance(key, Counter):
self.data[frozenset(key.items())] = value
else:
raise TypeError
def __getitem__(self, key):
if isinstance(key, Counter):
return self.data[frozenset(key.items())]
else:
raise TypeError
foo = Counter(['bar', 'shoo', 'bar'])
tmp = CounterDict()
tmp[foo] = 42
tmp[foo] # 42
Run Code Online (Sandbox Code Playgroud)
您可以通过CounterDict创建collections.UserDict.