本文介绍了具有多个索引的Python Map(Dict)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在寻找一个在两个不同索引下保存相同值的数据结构,我可以通过 访问数据。
I am looking for a data structure that holds the same values under two different indexes, where I can access the data by either one.
示例:
x = mysticalDataStructure()
x.add(1,'karl', dog)
x.add(2,'lisa', cat)
$ x[1].age
2
$ x['karl'].age
2
$ x[1].age = 4
$ x['karl'].age
4
是否有任何预先滚动,或什么是最好的方法来滚动我自己的(我需要通过索引访问(从0到n的数字增加1),并通过一个字符串)。
Is there anything prerolled, or what is the best approach to roll my own (I need access via an index (number going from 0 to n in increments of 1), and via a string).
collections.ordereddict
似乎没有快速随机访问通过这个位置,只要我看到我只能用迭代器走,直到我到达元素 i
(我可以按正确的顺序插入)。
collections.ordereddict
does not seem to have fast random access via the position, as far as I see I can only walk it with the iterator until I reach element i
(I can insert in the right order).
推荐答案
class MultiKeyDict(object):
def __init__(self, **kwargs):
self._keys = {}
self._data = {}
for k, v in kwargs.iteritems():
self[k] = v
def __getitem__(self, key):
try:
return self._data[key]
except KeyError:
return self._data[self._keys[key]]
def __setitem__(self, key, val):
try:
self._data[self._keys[key]] = val
except KeyError:
if isinstance(key, tuple):
if not key:
raise ValueError(u'Empty tuple cannot be used as a key')
key, other_keys = key[0], key[1:]
else:
other_keys = []
self._data[key] = val
for k in other_keys:
self._keys[k] = key
def add_keys(self, to_key, new_keys):
if to_key not in self._data:
to_key = self._keys[to_key]
for key in new_keys:
self._keys[key] = to_key
@classmethod
def from_dict(cls, dic):
result = cls()
for key, val in dic.items():
result[key] = val
return result
用法:
>>> d = MultiKeyDict(a=1, b=2)
>>> d['c', 'd'] = 3 # two keys for one value
>>> print d['c'], d['d']
3 3
>>> d['c'] = 4
>>> print d['d']
4
>>> d.add_keys('d', ('e',))
>>> d['e']
4
>>> d2 = MultiKeyDict.from_dict({ ('a', 'b'): 1 })
>>> d2['a'] = 2
>>> d2['b']
2
这篇关于具有多个索引的Python Map(Dict)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!