2017-11-28 4 views
0

私は辞書を持っている:Python OOP - ネストされた辞書のキーを参照する変数を作成する方法は?

my_dict = {1: {2: 'A'}, 2: {3: 'B'}, 3: {4: 'C}} 

私は、ネストされたキーを参照することができ、マーカーと呼ばれる文字列の形式、で変数を作りたいです。 たとえば、'mymarker'は、私のmy_dict[1][2]を指し、'myothermarker'は、my_dict[2][3]を指します。
これらは文字列なので、私のメソッドの1つに割り当てることができます。例えば、set_marker( 'mymarker'、1,2)です。これを私のコードにどのように実装できますか?

+0

これらのマーカーが何をするために必要なのかについてもっと詳しく説明しなければなりません。彼らはなぜ文字列ですか? –

+0

これは文字列なので、私のメソッドの1つにそれらを代入することができます。たとえば、set_marker( 'mymarker'、1,2) – user8927025

答えて

1

ネストされた辞書は内部の値に到達するために1つのキーだけを取るわけではないので、あなたが直接必要とするものを正確に行う方法はありません。いくつかのキーが必要です。しかし、必要ならタプルで複数のキーをまとめて保存することもできます。次に、ループ内の値を使用することができます(同じ深さにインデックスを付けるのではない場合)。または、展開していれば値を使用できます。

my_dict = {1: {2: 'A'}, 2: {3: 'B'}, 3: {4: 'C'}} 
mymarker = (1, 2) 
myothermarker = (2, 3) 

a, b = mymarker  # you can use unpacking when you know you're indexing to a specific depth 
print(my_dict[a][b]) 

d = my_dict 
for key in myothermarker: # or use a loop, for indexing to any depth 
    d = d[key] 
print(d) 

あなたは後で、あなたが可能なキーと一緒にset_marker関数に渡す、とすることを、あなたはあなたの「マーカー」の値は、文字列になりたいとコメントしました:

このような何かを試してみてくださいset_with_markerを呼び出して、メインディクショナリのキーで参照される値を変更します。上で説明した手法と組み合わせるのはそれほど難しくありませんが、文字列マーカーとそれらが参照するキーの間に入るためには、間接指定の追加レイヤーが必要です。 (my_dictは、インスタンス属性である)

markers = {} 
def set_marker(name, *keys): 
    markers[name] = keys  # save the keys into the markers dict (as lists) 

def get_with_marker(name): 
    d = my_dict 
    for key in markers[name]: # this is almost the same as the loop from above 
     d = d[key] 
    return d 

def set_with_marker(name, value): 
    *keys, last = markers[name] # unpack last name separately from the others 
    d = my_dict 
    for key in keys: # this is similar to before, but we don't index the last level yet 
     d = d[key] 
    d[last] = value # we index the last level here, for the assignment 

あなたは、これらの機能は、いくつかのクラスのメソッドになりたいことがあります。

は、ここであなたが欲しいものを行う必要があり、迅速、未テストの実装です。たくさんの場所にselfを追加する以外に、コードを大きく変更することはありません。

+0

タプルを考えてくれてありがとう。異なるキーを参照するために複数のマーカーが必要なので、マーカーを文字列として使用する方法はありますか? – user8927025

+0

私はそれが何を意味するのかよくわかりません。辞書のキーは数字なので、どこかから番号を取得する必要があります。たぶん、あなたの "マーカー"文字列からキーのタプルへの辞書マッピングを使用するでしょうか? – Blckknght

+0

私は次のように動作するsetterメソッドを持っています:set_marker( 'markergoeshere'、1,2)、私は複数のマーカーに対してこれを行うことができる必要があります。マーカーは 'A'を返すことができるはずで、 'A'を別の値に変更できるはずです – user8927025

関連する問題