29

次のように作成した辞書があります。

myDict = {}

次に、別の値を入れた別の辞書に対応するキーを追加したいと思います。

myDict[2000]['hello'] = 50

したがって、myDict[2000]['hello']どこかを通過すると、 が得られ50ます。

なぜ Python はそれらのエントリをすぐに作成しないのでしょうか? 問題は何ですか?KeyError は、存在しないエントリを読み込もうとしたときにのみ発生すると思っていましたが、ここで作成しているのですか?

4

5 に答える 5

39

KeyErrorにアクセスしようとしたときに、存在しないキーを読み取ろうとしているために発生しますmyDict[2000]別の方法として、 defaultdictを使用できます。

>>> from collections import defaultdict
>>> myDict = defaultdict(dict)
>>> myDict[2000]['hello'] = 50
>>> myDict[2000]
{'hello': 50}

defaultdict(dict)myDict が不明なキーに遭遇した場合、デフォルト値を返します。この場合、空の辞書である dict() によって返されるものは何でも返します。

于 2014-06-06T19:45:22.250 に答える
13

しかし、存在しないエントリを読み取ろうとしています:myDict[2000] .

コードであなたが言っていることの正確な翻訳は、「2000 のキーを持つエントリを myDict に与えて、そのエントリのキー 'hello' に対して 50 を保存してください」です。しかし、myDict には 2000 のキーがないため、エラーが発生します。

実際に行う必要があるのは、そのキーを作成することです。あなたは一度にそれを行うことができます:

myDict[2000] = {'hello': 50}
于 2014-06-06T19:35:44.260 に答える
9

あなたが望むのは、ネストされた dict を実装することです:

このアプローチをお勧めします:

class Vividict(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

ドキュメントから、d[key]

バージョン 2.5 で追加: dict のサブクラスがメソッドを定義する __missing__()場合、キーkeyが存在しない場合、d[key] 操作はキー key を引数としてそのメソッドを呼び出します

それを試すには:

myDict = Vividict()

myDict[2000]['hello'] = 50

そして myDict は次を返します:

{2000: {'hello': 50}}

そして、これはあなたが望む任意の深さで機能します:

myDict['foo']['bar']['baz']['quux']

ただ動作します。

于 2014-06-06T19:50:38.170 に答える
2

あなたは正しいですが、あなたのコードでは python は最初に myDict[2000] を取得してから割り当てを行う必要があります。そのエントリは存在しないため、その要素に割り当てることはできません

于 2014-06-06T19:36:56.893 に答える