2016-06-12 5 views
0

私はキーとデータの両方を含むものを使用するケースがあります。 私は、このデータとデータのdictインデックスの効率的なエンコードを希望します。 だから、事はクラスで、辞書は、そのインスタンスの辞書の指標である:メモリ効率的なdicts - 値からアイテムのキーを派生させる

thing1, thing2 = d['thing1'], d['thing2'] 

この:

d = {} 
class Thing: 
    def __init__(k,v): self.key=k; self.data=v; d[v]=self 

今、私が示したように事が私のコードでは、単一のオブジェクトを周りにオブジェクトを渡したいですソリューションが機能します。私は物事をキーで索引付けすることができ、それぞれからキーを取り出すことができますが、この解決策では、dictとThingオブジェクトの両方にキーへのポインタが重複して格納されています。

私は値からキーにアクセスする方法を教えてくれる方法で、「dict」を実装することができました。したがって、多くのハッシュメソッドは、キーへの第2のポインタの格納を避けることができます。

Pythonディクテーションの実装でこのような柔軟性が得られますか? これが不可能であると主張する立場にいるなら、それを聞いてみたいと思います。どうも。

注意:キーとデータの両方を1つのポインタで扱うことを後でしたいと思います。これを達成するためにヒープを割り当てる必要はありません。私の元の目標。

+4

なぜ私のキーは%sで、値は%sです "%(k、obj)' ??私はあなたがその鍵を知っていて、それを派生させる必要はないという価値観にアクセスすることができます。値からキーを取得する場合は、実際には別の方向に2番目のマップを作成する必要があります。 – JulienD

答えて

0

値を取得するためにキーを持っている必要があるので、値にキーを格納するのは奇妙です。

あなたはそれを保存したくない場合は、特別なゲッター機能でそれを得ることができます:私の指導は非常に正確ではありませんので、

def get_key_and_value(d, k): 
    return (k, d[k]) 

obj = get_key_and_value(d, k) 
print "my key is %s and value is %s" % (obj[0], obj[1]) 
+0

これはうまくいくかもしれませんが、私はここに小さなオブジェクトがたくさんあると思いますので、これらのオブジェクトのそれぞれに対して2番目のタプルオブジェクトを作成したくありません。私のコードでは、値の代わりにタプルを渡す必要があります...これは私のコード内のどこでもobj [1]を参照解除させてしまいます。私の書き直した質問を見てください。私は自分の目標をより明確にしようとしました。 thx –

0

あなたは十分なユースケースを説明していません。私はあなたの質問から、メモリを節約するために値にキーを格納したくないと仮定します(あなたの例で示したように - そして拒否されます)?さらに、その値にアクセスするために使用される値とキーの両方へのアクセスが必要な操作が必要になります。

何らかの形で値取得関数が生のキーハッシュにアクセスし、そこから何らかの形でキーを取得できるという確信は間違っています。 Python dictはこの情報を表示しません。私はこの能力をつくるために独自のPython拡張機能を使うことができると確信していますが、これはたくさんの仕事のように聞こえます(また、ユースケースを理解することなく、作品が価値があるかどうかを正確に判断できません) 。

代わりに、独自のdictクラスを作成し、カスタムメソッドにコードを追加するだけではどうでしょうか。このようなもの:

class MyDict(object): 
    def __init__(self): 
     self.d = dict() 
    def add(self, k, v): 
     self.d[k] = v 
    def later(self, k): 
     print("my key is %s and value is %s" % (k, self.d[k])) 

これはあなたが望んでいたものではない場合 - ユースケースについて詳しく説明できますか?

+0

私は私の質問を書き直そうとしました。あなたのソリューションは私にキーと値の両方を単一のオブジェクトとして与えません。どうも。 –

関連する問題