1

20 個の整数に一致する 20 個の文字列があります。すべての整数と文字列は一意です。検討中ですが、辞書を2つ作るのは避けたいです。1 つのディクショナリは文字列によってインデックスが作成され、もう 1 つのディクショナリは整数によってインデックスが作成されます。

  • この状況をどのように処理すればよいですか?

2 つのリストを作成しました。1 つは文字列を含み、もう 1 つは整数を含みます。2つの機能を構築することを考えています。1 つの関数で文字列が生成されます。他の関数は整数を生成します。もう 1 つの方法は、生成された引数が整数または文字列の場合に分岐して、これらを 1 つの関数に結合することです。

  • これはどのように辞書に匹敵しますか? 多くのCPUを消費しますか?(この関数は毎日何百万回も実行されます)
  • (string, int) であるタプルのリストを作成してから、int をリスト位置にマッピングし、もう 1 つの文字列をリスト位置にマッピングする 2 つの辞書を作成する必要がありますか? それは最善の方法でしょうか?

私は多くのアイテムを持っていないので、いくつかのメモリを犠牲にすることができます.

最適な方法と、その方法が最適である理由を説明してください。

ありがとうございました。

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

一意の文字列と一意の整数があるため、これら 2 つのセットの和集合も、他の 2 つの要素をすべて含む一意のリストになるはずです。両方を辞書に保持しても問題ないはずです

于 2012-10-17T15:40:57.730 に答える
3

どのようなソリューションを使用する場合でも、それを堅牢にしたい場合は、おそらく、一方を更新するときに他方の方向を自動的に更新するクラスをラップする必要があります。たとえば、@mgilson の手法を使用した基本的な双方向辞書の開始は次のとおりです (つまり、相互にマッピングしている 2 つのアイテム セットの間に重複がある場合は機能しません。ただし、異なる型を持つことはうまく機能します)。

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 に答える