Python dict喜欢surjective multiple key→value container

我目前需要一个类似于内置字典类型的类似功能的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().如果你需要它们,你必须自己实现它们.

上一篇:mysql – kubernetes和一般调试它


下一篇:跟踪更改的Javascript对象封装