2016-04-17 5 views
2

キーが存在するかどうかわからない場合は、辞書の特定のキーと値のペアが存在するかどうかを確認する最短の方法は?短い方法は何Python辞書でキーと値のペアが存在するかどうかを調べる

if 'X-Powered-By' in self.request.headers and self.request.headers['X-Powered-By'] == 'NodeBB': 
    do_something() 

if 'key' in my_dict and my_dict['key'] == 'value': 
    do_something() 

これは、のような長い変数名以上のキー/値の名前、と本当に長いです:

はこれまでのところ、私が作ってみましたキーとそれに対応する値の有無をチェックする

答えて

7

あなたは値を取得し、すぐにそれを比較することができます

# default return value is None if key is not found 
if mydict.get("key") == "somevalue" 

または

# Or specify your own default value 
if mydict.get("key", False) == "somevalue" 

Python dict.get docsをチェックしてください。

+0

感謝の存在を探しているなら、あなたは最初の応答であり、これはAperoの応答よりも短くなっています。私ができるなら、これを受け入れるだろう。 –

-1

コードを読みやすくするために[OK]を、私の提案、:

headers = self.request.headers 
if headers.get('X-Powered-By') == 'NodeBB': 
    do_something() 

これはdict.getとして別のショートコード間違いなく効率的ではありませんのようになります。実際に

if ('X-Powered-By', 'NodeBB') in self.request.headers.items(): 
    do_something() 
+1

ええ、私はちょうどそれ自身の考え:) –

+1

これは動作します。しかし、それは 'dict'の本当の力を無視します。他の解は 'O(1)'です。これは 'O(N)'です! – schwobaseggl

+1

@Apero質問は簡潔さであってスピードではないので、あなたの答えをアップアップしました。私は決して大きなdict'sを扱うつもりはないので、速度は重要ではありません。あなたの答えに感謝します。 (これは私自身が考えたものでもあり、私は別の解決方法があるかどうかを見ていました)。短くても私はまだDavor Lucicのソリューションを受け入れますが、あなたの答えが遅いという問題はありません。 –

2

、のどれも答えは完全な問題を捕らえます。照会されている値がNoneまたは何らかの既定値が提供されている場合は、get()ベースのソリューションは失敗します。以下は、まだO(1)dictを使用しながら、真の(他のtry-except答えとは違って)KeyError秒(get()とは異なり)キーの存在を確認し、そしてないオーバー'except'-INGの、デフォルト値に頼らない、最も一般的に適用解決策になるかもしれません検索(items()アプローチとは異なり):

try: 
    assert my_dict[key] == value: 
except (KeyError, AssertionError): 
    do_sth_else() # or: pass 
else: 
    do_something() 
0

あなただけのキー

if not 'key' in my_dict: 
    my_dict['key'] = 'some default value' 
関連する問題