python - 无序列表作为 dict 键
问题描述
我希望能够做类似的事情:
foo = Counter(['bar', 'shoo', 'bar'])
tmp = {}
tmp[foo] = 5
换句话说,是否有一个可散列的等价物Counter
?请注意,我不能使用frozenset
,因为我有重复的元素,我想保留在密钥中。
编辑: 在我的实际应用程序中, foo 中的对象可能无法相互比较,因此无法对列表进行排序。
解决方案
您似乎需要一种使用无序键值对作为键的方法。Afrozenset
可能是要走的路,尽管您必须从 ofitems
而Counter
不是它的keys
.
foo = Counter(['bar', 'shoo', 'bar'])
tmp = {}
tmp[frozenset(foo.items())] = 5
# tmp: {frozenset({('bar', 2), ('shoo', 1)}): 5}
如果这令人满意,您可以通过定义自己的映射类型来实现此转换,如下所示:
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
您可以通过CounterDict
创建collections.UserDict
.
推荐阅读
- angular - 如何在我的应用程序中将 ng 模型值用作全局值?
- javascript - 在 Slider Revolution 中添加到购物车 Woocommerce
- r - 在 R 中创建详尽的案例列
- visual-studio-2010 - 我没有错误,但是:“OleDbException 是查询表达式中未处理的语法错误(缺少运算符)”如何解决这个问题?
- sql-server - ElasticSearch:如何将搜索作为 MSSQL “LIKE word% with tokenized string?
- php - 在单选按钮上提交后的消息
- .net - Azure 服务总线负数计划消息
- zone.js - 如何在另一个区域安排任务
- mysql - Google App Engine 连接外部 MySQL Node.js
- html - 如何在 pug/jade 中使用模运算符?