Python dict喜欢surjective multiple key→value container
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python dict喜欢surjective multiple key→value container,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1626字,纯文字阅读大概需要3分钟。
内容图文
![Python dict喜欢surjective multiple key→value container](/upload/InfoBanner/zyjiaocheng/784/669ae2d08ae64c0c95663a9c221f9fc9.jpg)
我目前需要一个类似于内置字典类型的类似功能的Python容器类.基本上我需要的是一个字典,其中主键旁边的任意数量的键,映射到相同的值.但是当迭代它时,它应该只在(primary_key,value)对上迭代,如果请求键列表,则只迭代主键.
如果这已经实施,我宁愿不重新发明轮子.那么是否有一个模块提供这样的容器?如果没有,我将自己实施.
解决方法:
这是一个快速实现:
class MultipleKeyDict(dict):
__slots__ = ["_primary_keys"]
def __init__(self, arg=None, **kwargs):
self._primary_keys = {}
self.update(arg, **kwargs)
def __setitem__(self, key, value):
super(MultipleKeyDict, self).__setitem__(key, value)
self._primary_keys.setdefault(value, key)
def __delitem__(self, key):
value = self[key]
super(MultipleKeyDict, self).__delitem__(key)
if self._primary_keys[value] == key:
del self._primary_keys[value]
for k, v in super(MultipleKeyDict, self).iteritems():
if v == value:
self._primary_keys[value] = k
break
def __iter__(self):
return self.iterkeys()
def update(self, arg=None, **kwargs):
if arg is not None:
if isinstance(arg, collections.Mapping):
for k in arg:
self[k] = arg[k]
else:
for k, v in arg:
self[k] = v
for k in kwargs:
self[k] = kwargs[k]
def clear(self):
super(MultipleKeyDict, self).clear()
self._primary_keys.clear()
def iteritems(self):
for v, k in self._primary_keys.iteritems():
yield k, v
def items(self):
return list(self.iteritems())
def itervalues(self):
return self._primary_keys.iterkeys()
def values(self):
return self._primary_keys.keys()
def iterkeys(self):
return self._primary_keys.itervalues()
def keys(self):
return self._primary_keys.values()
唯一令人讨厌的一点是它必须搜索整个dict以防主键被删除.
我省略了copy(),pop(),popitem()和setdefault().如果你需要它们,你必须自己实现它们.
内容总结
以上是互联网集市为您收集整理的Python dict喜欢surjective multiple key→value container全部内容,希望文章能够帮你解决Python dict喜欢surjective multiple key→value container所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。