1

我有 20 个匹配 20 个整数的字符串。所有整数和字符串都是唯一的。我正在考虑但想避免创建两个字典。一个字典将由字符串索引,一个字典将由整数索引。

  • 我应该如何处理这种情况?

我创建了两个列表。一个包含字符串,另一个包含整数。我正在考虑构建两个功能。一个函数将产生一个字符串。另一个函数将产生一个整数。如果产生的参数是整数或字符串,另一种选择是通过分支将它们组合成一个函数。

  • 这和字典有什么可比性?会不会消耗很多cpu?(此功能每天会运行数百万次)
  • 我应该只创建一个 (string, int) 的元组列表,然后创建两个字典,一个将 int 映射到列表位置,另一个将字符串映射到列表位置吗?这会是最好的方法吗?

我没有很多东西,所以我可以牺牲一些记忆。

请解释最好的方法并解释为什么它是最好的。

谢谢你。

4

2 回答 2

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

由于您有唯一的字符串和唯一的整数,那么这两个集合的并集也应该是一个唯一列表,其中包含其他两个集合中的所有元素。将它们都放在字典中应该没有问题

于 2012-10-17T15:40:57.730 回答
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
于 2012-10-17T15:57:34.547 回答