0

これはばかげた質問かもしれませんが、何らかの理由で、現時点では解決策がわかりません。

リスト形式のデータにすばやく効率的にアクセスしたいと考えています。たとえば、質問のリストは次のとおりです。

q = {}
q[1] = "my first string"
q[2] = "my second string"
q[3] = "my third string"

q[2] を実行すると、質問 2 の文字列が何であるかを簡単に見つけることができます。しかし、q に次の文字列をインデックス付けして、質問番号も取得したいと思います。

q["my second string"] -> gives 2 as answer

キーを反復処理せずにこれを行い (辞書の目的を無効にします)、文字列をキーとして使用して 2 番目の辞書を定義しないようにして、メモリの浪費を回避したいと考えています。これは可能ですか?

最終的には、たとえば q[2] または q["my second string"] にアクセスして、数値または文字列をそのデータのキーとして使用するかどうかにかかわらず、質問 2 に関連付けられたデータを取得したいと考えています。データの重複を回避しながら、すべてのキーを反復処理する必要なく、これは可能ですか?

4

4 に答える 4

2

キーとしてintとを混在させても問題ありませんstr

>>> q = {}
>>> q[1] = "my first string"
>>> q[2] = "my second string"
>>> q[3] = "my third string"
>>> q.update({v:k for k,v in q.items()})
>>> q["my second string"]
2
于 2012-06-28T07:30:48.617 に答える
1

OrderedDictを使用できますが、いずれかの方向については、通常の辞書検索ほど効率的ではありません。

from collections import OrderedDict
q = OrderedDict()
q["my first string"] = 1
q["my second string"] = 2
q["my third string"] = 3
# Now you have normal key lookups on your string as a normal dict, and to get the order
q.values()[1]  # To get the second value out
# To get the key, value pair of the second entry
q.items()[1]
# Would return `('my second string', 2)`
于 2012-06-28T07:24:36.260 に答える
0

これはPython での効率的な双方向ハッシュ テーブル? で尋ねられました。

答えは同じままです - http://pypi.python.org/pypi/bidictbidictから使用してください

于 2012-06-28T07:38:30.383 に答える
0
class MyDict(dict):
    def __init__(self, **kwargs):
        super(MyDict, self).__init__(**kwargs)
        for k, v in kwargs.iteritems():
            self[v] = k
    def __setitem__(self, key, val):
        super(MyDict, self).__setitem__(key, val)
        super(MyDict, self).__setitem__(val, key)

d = MyDict(a=1, b=2)
print d[1] # "a"
print d[2] # "b"
d['c'] = 3
print d[3] # "c"
于 2012-06-28T07:39:56.487 に答える