我有20个匹配20个整数的字符串。所有整数和字符串都是唯一。我正在考虑但是想避免创建两个词典。一个字典将被字符串索引,一个字典将被整数索引。
我创建了两个列表。一个包含字符串,另一个包含整数。我正在考虑建立两个功能。一个函数将产生一个字符串。另一个函数将产生一个整数。另一种方法是通过分支将这些组合成一个函数,如果生成的参数是整数或字符串。
我没有很多东西,所以我可以牺牲一些记忆。
请解释最好的方法,并解释为什么它是最好的。
谢谢。
答案 0 :(得分:4)
为什么不使用1个字典来进行两种映射?
ints = list(range(10))
strs = [str(x) for x in ints]
d = dict(zip(ints,strs))
d.update(zip(strs,ints))
print repr(d[1]) # '1'
print repr(d['1']) # 1
由于您具有唯一字符串和唯一整数,因此这两个集合的并集也应该是唯一列表,其中包含来自其他两个集合的所有元素。在词典中保存它们应该没有问题
答案 1 :(得分:3)
无论你使用什么解决方案,如果你想要它是健壮的,你应该在它周围包装一个类,当你更新它时会自动更新另一个方向。例如,这里是使用@ mgilson技术的基本双向字典的开始(这意味着如果两个项目之间存在任何重叠,那么它将无法工作;但是,不同的类型可以很好地工作):
class BiDict(dict):
"""Bidirectional Dictionary - setting 'key' to 'value' also
sets 'value' to 'key' (so don't use overlapping mappings)
"""
def __init__(self, *args):
super(BiDict, self).__init__(*args)
# After regular dict initialization, loop over any items
# and add their reverse. Note that we can't use any of the
# iter* methods here since we're adding items in the body
# of the loop.
for key in self.keys():
super(BiDict, self).__setitem__(self[key], key);
def __setitem__(self, key, val):
# If the key has an old value, delete its reverse
if key in self:
super(BiDict, self).__delitem__(self[key])
# Then add both forward and reverse for the new value
super(BiDict, self).__setitem__(key, val);
super(BiDict, self).__setitem__(val, key);
def __delitem__(self, key):
# delete both directions
if key in self:
super(BiDict, self).__delitem__(self[key]);
super(BiDict, self).__delitem__(key);
你可以像这样使用它:
>>> from bidict import BiDict
>>> d = BiDict({'a':1,'b':2})
>>> d['a']
1
>>> d[2]
'b'
>>> d['c']=3
>>> d[3]
'c'
>>> del d['a']
>>> d['a']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'a'
>>> d[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 1