ネストされた辞書で作業する方法を検索すると、次のコードがnoskloで投稿されていることがわかりました。Pythonでは、次のAutoVivificationクラスはどのように機能しますか?
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
テスト:
a = AutoVivification()
a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6
print a
出力:
{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
私はかなり初心者プログラマです。私は、私の唯一の正式な訓練が高校のターボ・パスカルにあるということで、私が自分の時間に知っていることのほとんどを学んだ。 __init__
、クラスメソッドを使用し、クラスのインスタンス内にデータを格納するなど、簡単な方法でクラスを使用できます。foo.man = 'choo'
。
どのようにして一連の角括弧がクラスを介して正しく指示されるのかわかりません(私は彼らが何とか__getitem__
と呼んでいると推測しています)、メソッド3を呼び出すことなく、回。
私は、クラス宣言のが__init__
によって処理されるという印象を受けました。
これまではtry: except:
をかなり単純な方法で使用してきましたが、それはtry
のように私には、それが実行されるとき、一連の機能を呼び出すように見える__getitem__
。現在のレベルの辞書が存在する場合、試行は合格して次の辞書に移動します。 except
は、KeyError
があるときに実行されますが、私はself
が以前と同じように使われているのを見ていません。 Self
は辞書のように扱われていますが、self
はclass AutoVivification
のインスタンスでした...それはどちらですか?私はこのような行を二度も割り当てたことはありませんfoo = man = choo
しかしvalue
はself[item]
を指していると思われますが、self[item]
はtype(self)
の結果を指しています。しかしtype(self)
は次のようなものを返すでしょう:<class '__main__.AutoVivification'>
そうでしょうか?私は最後の余分な丸括弧が何のためにあるか分からない。関数がどのように呼び出されているのかわからないので、value
が返されている場所はわかりません。
すべてのご質問があります。私は理解していないと私はそれほど多くのことがありますが、私は非常にほとんど保持しない時間のためのドキュメントを読むことが不足しています。このコードは目的を果たすように見えますが、使用する前に理解したいと思います。
私は自分のプログラムでネストされた辞書を使って何をしようとしているのか知りたければ、天文学的なスケールで地図データを保持しようとしています。私は10^6項目の辞書/リストを4回入れ子にすることはできませんが(それは10^24項目です!)、空白はほとんど空ですので、空の値を完全に残して、そこに何かがあるときだけ割り当てることができます。私を困惑させていたのは、辞書を効率的に処理する方法でした。