web-dev-qa-db-ja.com

Python割り当て時の辞書キーエラー-これを回避するにはどうすればよいですか?

私はこのように作成した辞書を持っています:

myDict = {}

次に、別のディクショナリに対応するキーを追加し、別のディクショナリに別の値を入力します。

myDict[2000]['hello'] = 50

だから私が渡すときmyDict[2000]['hello']どこかで、それは50

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

20
ulak blade

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

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

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

23
OldGeeksGuide

しかし、あなたはare存在しないエントリを読み込もうとしています:myDict[2000]

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

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

myDict[2000] = {'hello': 50}
7
Daniel Roseman

あなたがしたいことは ネストされたdictを実装する

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

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

ドキュメントから、_d[key]_の下

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

それを試すには:

_myDict = Vividict()

myDict[2000]['hello'] = 50
_

そしてmyDictは今返す:

_{2000: {'hello': 50}}
_

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

_myDict['foo']['bar']['baz']['quux']
_

うまくいきます。

4
Aaron Hall

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

1