私はPythonユーティリティを開発しています。これの一部はファイルのインデックスを生成することです
深さを知らずに多次元辞書に動的にアクセスすることは可能ですか?私は例のデータを持っていた場合
はすなわち:
example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}
は私が example["main","2","1"]
に似た何かを要素にアクセスすることができ、それが2-1
を返す方法はありますか? 自分のダイビングアルゴリズムを書くことができますが、私の経験では値に書き込むことができないことがわかりました。
["key"、 "key2"]でPython辞書にアクセスする
答えて
あなたが本当にそうする必要がある場合は、独自のdictクラスをロールする必要があります。幸いにもあなたは__getitem__
からdict
まですべてを継承することができます。特別にコード化されていない限り
class MyDict(dict):
def __getitem__(self, keys):
if isinstance(keys, str):
# this special-case saves you if you try to do normal indexing
# on a string.
return super().__getitem__(keys)
cur = self
for key in keys:
cur = cur.get(key, {})
# the default option here returns an empty dict instead
# of raising a KeyError. That might not be what you want
return cur
これはタプルのキーにあなたの能力を削除することに注意してください、そう{("some", "tuple", "values"): "any value"}
のようなキー/ヴァルスはアクセスできなくなります。それは...のように見えるかもしれません。
次に、この新しいdictにマッピングをキャストし、その方法で検索できます。
example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}
result = MyDict2(example)['2', '2', '1']
また__setitem__
を継承する場合には、同様に、このことにより、値を設定する必要が言及。
class MyDict(dict):
def __getitem__(self, keys):
# as above
def __setitem__(self, keys, value):
if isinstance(keys, str):
super().__setitem__(keys, value)
cur = self
for key in keys[:-1]:
cur = cur.setdefault(key, {})
cur[keys[-1]] = value
彼はこれらのネストされたdict値への代入について言及していますので、 '__setitem __()'も追加したいかもしれません。 – Aaron
@Aaronうーん、テストして実行可能になるまで削除しています。 –
'super().__ setitem __(keys、value)'は 'super()を返すべきではありません。__setitem __(keys、value) 'を返すと、奇妙なエントリがロードされます。 –
あなたはこのように機能させることができます。使用方法の
def get_item(d, keys):
current = d
for k in keys:
current = current[k] # You can add some error handling here
return current
あなたが最後のインデックスで値を変更したい場合は、あなたがこのような何かを行うことができます。
def set_item(d, keys, new_value):
current = d
for k in keys[:-1]: # All the keys except the last one
current = current[k]
current[keys[-1]] = new_value
似たようなものを作成しました。問題はありません。同様の関数で値を設定します。 –
私はセッターで自分の答えを変更しました。 – Arya
また例えば、派生dictのクラスで@Aryaによって提案されたアイデアをラップすることができます。:
class ListAccess(dict):
def __getitem__(self, item):
if type(item) in [tuple,list]:
item = list(item)
ret = self
while True:
try:
ret = ret[item.pop(0)]
except IndexError:
break
return ret
else:
return super(ListAccess, self).__getitem__(item)
store = ListAccess({'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}})
print store['main','2','1']
- 1. javascriptでpython辞書にアクセスする
- 2. Pythonで辞書の辞書にアクセスする
- 3. Python辞書のアクセス要素
- 4. Python辞書から文字列(key + value)を取得する
- 5. 辞書の中のリストにあるアイテムにアクセスするpython
- 6. 辞書辞書python
- 7. 辞書をPythonで辞書に保存
- 8. Pythonでjsonファイル辞書のキー値にアクセスするには
- 9. Pythonランタイムエラー辞書
- 10. pythonで辞書に
- 11. Python辞書でキーにアクセスする方法
- 12. Python:辞書?
- 13. Python - 辞書のリスト。アクセスの問題
- 14. 辞書のpython辞書
- 15. djangoテンプレートエンジンで辞書にアクセスする
- 16. Python - 辞書内にネストされた値にアクセスする
- 17. 辞書をファイルに書く方法Python?
- 18. Pythonでの辞書の辞書
- 19. CSV - Python辞書
- 20. Javascript:辞書 'key'の値がループの外側でヌルになる
- 21. Pythonの辞書
- 22. 辞書のリストから辞書値にアクセスする
- 23. 辞書をPythonで書く
- 24. python辞書のキーエラー
- 25. Pythonのアイデンティティ辞書
- 26. メイクPythonの辞書
- 27. 辞書を「key = val&key = val ...」の文字列に連結します。
- 28. csvをPythonの辞書の辞書に変換するには?
- 29. 辞書の辞書をDataFrame Pythonに変換する
- 30. 配列辞書を辞書に変換するpython
をあなたは「その値に書き込むことができない」とはどういう意味ですか? –
あなたはいつでも 'example ['main'] ['2'] ['1']'を実行できます。もちろん、キー( 'main'、 '2'、 '1')を知っている必要があります – lucasnadalutti
なぜexample ["main"、 "2"、 "1"] ' main "] [" 2 "] [" 1 "]'? – thorhunter