14

Python 2d dictに内部キー/値があるかどうかを確認する単一行の方法はありますか?

今私はこのような何かをします:

if d.has_key(k1):
    if d[k1].has_key(k2): 
        # do something

これを行うためのより良い方法はありますか?

ありがとう

4

6 に答える 6

23
if k2 in d.get(k1, {}):
    # do something

上記のフラグメントは、k1 が実際に存在するかどうかを気にせず、単に k2 が存在する場合にその中に存在するかどうかを知りたい場合に便利です。コード スニペットからわかるように、私はin演算子を好みますが、同じように簡単に言うことができます。

if d.get(k1, {}).has_key(k2):
    # do something

そのイディオムを好むが、has_keyメソッドは Python 3.x で非推奨になっているため、おそらく避ける必要があります。

于 2012-06-26T17:17:05.720 に答える
14

使用できますin

if k1 in d and k2 in d[k1]:

このhas_keyメソッドは廃止され、Python 3.x で削除されました。

関連している:

于 2012-06-26T17:17:36.233 に答える
6

コメントするほどの評判はありませんが、key1 の値が None の場合、一番上の提案は失敗することに注意してください。

if k2 in d.get(k1, {}):
    # do something

その場合は失敗しd = {'k1': None}ます。キーの値を確認してください。

于 2015-11-20T01:57:02.333 に答える
4
if d.has_key(k1) and d[k1].has_key(k2): 
于 2012-06-26T17:16:25.327 に答える
2

最初の質問に対する答えはイエスです。私はエリの答えを考えます

if k2 in d.get(k1, {}):

d で k1 を 2 回検索することを避けるため、最適なワンライナーです。2 番目の質問に対する答えは、どちらかのテストが失敗した場合に何をしたいか、および 2 つの失敗のケースで別のことをしたいかによって異なります。もしそうなら:

try:
    d1 = d[k1]
    if k2 in d1:
        <both tests passed>
    else:
        <second test failed>
except KeyError:
    <first test failed>
于 2012-06-26T22:04:25.957 に答える
1

Python 3.xで非推奨になっているため、 has_key()useget()を使用しないでください。has_key()

d.get(k1,None) and d[k1].get(k2,None): 
于 2012-06-26T17:19:16.403 に答える