2

ネストされた辞書から値を取得する標準的な方法はありますか? 関数は比較的簡単に記述できますが、そのような方法で使用できる PSL または言語自体に既に何かがあるかどうかに興味があります。

これが私が意味することの例です:

def grab_from_dict(d, *keys):
    assert isinstance(d, dict), 'd must be of type dict'

    current_dict = d
    for key in keys[0 : -1]:
        if key not in current_dict:
            return None

        current_dict = current_dict[key]

    if current_dict is None:
        return None

    return current_dict.get(keys[-1], None)

d = {
    'a' : {
        'b' : {
           'c1' : {
                'd' : 'leeloo'
            },
           'c2' : {
                'd' : None
            },
           'c3' : {
                'e' : None
            },
            'c4' : None
        }
    }
}

print grab_from_dict(d, 'a', 'b', 'c1')
> {'d': 'leeloo'}
print grab_from_dict(d, 'a', 'b', 'c1', 'd')
> leeloo
print grab_from_dict(d, 'a', 'b', 'c2')
> {'d': None}
print grab_from_dict(d, 'a', 'b', 'c2', 'd')
> None
print grab_from_dict(d, 'a', 'b', 'c3')
> {'e': None}
print grab_from_dict(d, 'a', 'b', 'c3', 'd')
> None
print grab_from_dict(d, 'a', 'b', 'c4')
> None
print grab_from_dict(d, 'a', 'b', 'c4', 'd')
> None
print grab_from_dict(d, 'a', 'b', 'c5')
> None
print grab_from_dict(d, 'a', 'b', 'c5', 'd')
> None

これにより、親辞書の存在を気にせずに、ネストされた辞書の深い値を取得する方法が得られます。したがって、これを書く代わりに:

value = None
if 'a' in d and d['a'] not None:
    if 'b' in d['a'] and d['a']['b'] is not None:
        if 'c1' in d['a']['b'] and d['a']['b']['c1'] is not None:
            value = d['a']['b']['c1'].get('d', None)
print value
> leeloo

私はこれを書くことができます:

value = grab_from_dict(d, 'a', 'b', 'c1', 'd')
print value
> leeloo

親が欠落している場合、関数は単純に None を返します。

value = grab_from_dict(d, 'a', 'a', 'c1', 'd')
print value
> None
4

3 に答える 3

1

例外をキャッチするとうまくいくはずです:

try:
    result = d['a']['b']['c1']
except KeyError:
    result = None
于 2013-11-13T21:14:22.273 に答える
1

この種の動作で記述されたカスタム コンテナ クラスを記述/検索することもできます (キーを取得しようとすると、それ自体を返す NoneDict オブジェクトが含まれている可能性があります)。

try:
    x = d['a']['b']['c5']['d']
except KeyError:
    x = None

これは実際には、予想されるエラーを処理する方法をプログラムに伝えているだけだからです。私はその小さなコードブロックを「pythonic」な方法と呼んでいます。

于 2013-11-13T21:18:49.520 に答える
0

なぜ関数を探しているのですか?これはあなたが探しているものをカバーしていませんか?

>>> d['a']['b']['c1']
{'d': 'leeloo'}
>>> d['a']['b']['c1']['d']
'leeloo'
于 2013-11-13T20:47:43.470 に答える