そのキーが存在する場合にディクショナリ値を取得する方法、または単に返す方法が必要です None
しない場合はです。
ただし、KeyError
存在しないキーを検索すると、Pythonでは例外が発生します。キーを確認できることはわかっていますが、もっと明確なものを探しています。None
キーが存在しない場合に戻る方法はありますか?
そのキーが存在する場合にディクショナリ値を取得する方法、または単に返す方法が必要です None
しない場合はです。
ただし、KeyError
存在しないキーを検索すると、Pythonでは例外が発生します。キーを確認できることはわかっていますが、もっと明確なものを探しています。None
キーが存在しない場合に戻る方法はありますか?
回答:
使用できます dict.get()
value = d.get(key)
None
場合は戻りますkey is not in d
。次の代わりに返される別のデフォルト値を指定することもできますNone
。
value = d.get(key, "empty")
None
は、キーがNone
dictで明示的にマッピングされている場合に返されることに注意してください。それが目的に合わない場合は、などを使用できますd.get(key) or "empty"
。
[]
、""
、False
、0.0
実際またはNone
)、その後、あなたのソリューションは、常に返します0
。None
値としてs を期待する場合は、if key in d:
明示的にチェックを行う必要があります。
"empty"
がkey
の有効なキーでない場合に返されd
ます。key
マッピング先の値とは関係ありません。
クラスのget()
メソッドを使用する必要がありますdict
d = {}
r = d.get('missing_key', None)
これはになりr == None
ます。キーが辞書にない場合、get関数は2番目の引数を返します。
None
明示的に渡す必要はありません。これがデフォルトです。
より透過的なソリューションが必要な場合は、サブクラス化dict
してこの動作を実現できます。
class NoneDict(dict):
def __getitem__(self, key):
return dict.get(self, key)
>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True
defaultdict
まだ存在しない要素が要求されるたびに大きくなることです。これは常に望ましいとは限りません。
foo['bar']['test']['sss']
に戻るNone
ようにすることを意味します。1つの深さの後、TypeError
代わりに与え始めますKeyError
NoneDicts
ます。これはKeyError
、最も内側のオブジェクトで発生する場合に役立ちます。それ以外の場合の問題は、None
オブジェクトを返すと、それをサブスクライブできなくなることです。醜いハックの1つは、のようにテストする別のオブジェクトを返すことNone
です。ただし、これは恐ろしいバグにつながる可能性があることに注意してください。
return dict.get(self, key)
してもよろしいreturn super().get(key)
ですか?たとえば、dictの代わりにOrderedDictを使用する場合、複数行のコードを変更する必要はありません。
私は通常、このような状況ではdefaultdictを使用します。引数を取らず、新しいキーを検出したときに値を作成するファクトリメソッドを提供します。新しいキーで空のリストのようなものを返したい場合に便利です(例を参照)。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
defaultdict
存在しない要素が要求されるたびに成長し続けることです。
1行のソリューションは次のようになります。
item['key'] if 'key' in item else None
これは、ディクショナリ値を新しいリストに追加しようとして、デフォルトを提供したい場合に役立ちます。
例えば。
row = [item['key'] if 'key' in item else 'default_value']
他の人が上で言ったように、あなたはget()を使うことができます。
ただし、キーを確認するには、次の操作も実行できます。
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
get
メソッドの理由です。
私はpython2とpython3で可能だったことにびっくりしました。python3の結果に基づいて答えます。私の目的は単純でした:辞書形式のjson応答でエラーが発生したかどうかを確認してください。私の辞書は「トークン」と呼ばれ、私が探しているキーは「エラー」です。私はキー「エラー」を探していますが、そこに値Noneを設定していない場合は、値がNoneであるかどうかを確認します。そうであれば、コードを続行します。「エラー」キーがある場合は、elseステートメントで処理します。
if ((token.get('error', None)) is None):
do something
.get(key)
代わりに使用してください[key]