我目前需要一个具有类似内置dict
类型功能的 Python 容器类。基本上我需要的是一个字典,其中主键旁边的任意数量的键映射到相同的值。但是,当迭代它时,它应该只迭代(primary_key, value)
对,如果请求键列表,则只迭代主键。
如果这已经实施,我宁愿不重新发明轮子。那么是否已经有提供这种容器的模块了?如果没有,我将自己实现它。
我目前需要一个具有类似内置dict
类型功能的 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()
唯一混乱的地方是它必须搜索整个字典,以防主键被删除。
我省略了copy()
,pop()
和. 如果你需要它们,你必须自己实现它们。popitem()
setdefault()
最简单和最简单的解决方案是使用两个字典,其中一个将辅助键映射到主键。如果由于某种原因您需要反向映射,则可以将其包含在主字典中。
sec = {'one': 'blue', 'two': 'red', 'three': 'blue', # seconary keys
'blue': 'blue', 'red': 'red'} # include identity mapping for primaries
dict = {'blue': ('doll', '$9.43', ('one', 'three')),
'red': ('truck', '$14.99', ('two',)) }
record = dict[sec['two']]
print('Toy=', record[0], 'Price=', record[1])
现在有一个多键字典 python 包。
https://pypi.python.org/pypi/multi_key_dict/1.0.2
从链接:
从 multi_key_dict 导入 multi_key_dict k = multi_key_dict() k[1000, 'kilo', 'k'] = 'kilo (x1000)' print k[1000] # 将打印 'kilo (x1000)' print k['k'] # 也会打印 'kilo (x1000)' # 同样的方式可以更新、删除对象: # 如果使用一个键更新对象,则新值将 # 可以使用任何其他键访问,例如上面的例子: k['公斤'] ='公斤' print k[1000] # 现在将在值更新时打印 'kilo'