我正在寻找一个在两个不同索引下保存相同值的数据结构,我可以通过 一个 来访问数据。
示例:
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为增量),并通过字符串)。
collections.ordereddict
似乎没有通过该位置进行快速随机访问,据我所知,我只能使用迭代器来处理它,直到我到达元素i
(我可以按正确的顺序插入) )。
答案 0 :(得分:11)
有一个特殊原因你不能只使用字典:
x = {}
x[1] = x['karl'] = dog
x[2] = x['lisa'] = cat
然后你可以通过它们访问它。
如果你真的不想重复自己,你可以这样做:
class MysticalDataStructure(dict):
def add(self, key1, key2, value):
return self[key1] = self[key2] = value
x = MysticalDataStructure()
x.add(1, 'karl', dog)
x.add(2, 'lisa', cat)
答案 1 :(得分:7)
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
答案 2 :(得分:1)
只需使用三张地图。
maps = [dict(), dict(), dict()]
def insert(rec):
maps[0][rec[0]] = rec
maps[1][rec[1]] = rec
maps[2][rec[2]] = rec
对rec对象的关键属性的更改需要重新插入。就像任何其他地图一样,当您更改对象的键时。
地图只是地图键 - >对象,毕竟。它们实际上并不存储对象的副本(它不是垃圾收集的)。所以地图就是一个索引,仅此而已。如果需要三个索引,请使用三个映射。编写几个胶水代码函数来管理它们。
如Trevor所述,您还可以使用共享词典:
index = dict()
def insert(rec):
index[rec[0]] = rec
index[rec[1]] = rec
index[rec[2]] = rec
然后你可以通过它们访问它。
请注意关键的碰撞!