ネストされた辞書を操作する方法を探しているときに、noskloによって投稿された次のコードを見つけました。説明したいと思います。
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 回呼び出すことなく、それぞれがどのように簡潔に処理されるかがわかりません。
(dict)
クラス宣言の は によって処理されるという印象を受けました__init__
。
私はtry: except:
以前にも、非常に単純な方法で使用しました。try
が実行されると、一連の関数が呼び出されているように見えます__getitem__
。現在のレベルの辞書が存在する場合、try はパスして次の辞書に移動することがわかりました。except
、私が集めると、 があるときに実行されますが、そのように使用されるのKeyError
は見たことがありませんself
。 のインスタンスSelf
だと思っていたのに、辞書のように扱われています...両方ですか?このように 2 回続けて代入したことはありませんが、 が を指しているのに対し、 が の結果を指していると思われます。しかし、次のようなものを返します:self
class AutoVivification
foo = man = choo
value
self[item]
self[item]
type(self)
type(self)
<class '__main__.AutoVivification'>
そうじゃない?最後にある余分な丸括弧が何のためにあるのかわかりません。関数がどのように呼び出されているのかわからないため、どこvalue
に返されているのかわかりません。
質問ばかりですみません!これには理解できないことがたくさんあり、ドキュメントを何時間も読んでいない限り、どこを調べたらよいかわかりません。このコードは私の目的を果たしているように見えますが、使用する前に理解したいと思います。
ネストされた辞書を使用してプログラムで何をしようとしているのか知りたい場合: 天文学的なスケールで地図データを保持しようとしています。4 回ネストされた 10^6 アイテムの辞書/リスト (つまり 10^24 アイテム) を作成することはできませんが、スペースはほとんど空であるため、空の値を完全に除外して、何かがある場合にのみ割り当てることができます。私を悩ませていたのは、辞書を効率的に処理する方法でした。