11

TLDR の概要

に似ているがネストされnavigateDictた で安全なナビゲーションを行う関数を作成しました。次のようなコードを置き換えますdictdict.get()

if 1 in data and 'i' in data[1] and 'a' in data[1]['i']:
    print data[1]['i']['a']
else:
    print "Not found"

ほぼ同等の

found = navigateDict(data, 1, 'i', 'a')
if found is not None:
    print found
else:
    print "Not found"
  • これに似たものはすでに標準ライブラリの一部ですか?
  • 同じことを行うためのより慣用的な方法はありますか?
    • パス コンポーネント キーを複数回入力する必要がある応答は、おそらく回答ではありません。

追加の詳細

実装は次のとおりです。

# Allow fallback value other than None
def navigateDictEx(d, keys, fallback=None):
    for key in keys:
        if key in d:
            d = d[key]
        else:
            return fallback
    return d

def navigateDict(d, *keys):
    return navigateDictEx(d, keys)

使用例については概要を参照してください。

Pythonic であろうとなかろうと、この関数は、冗長性が悪い考えである場所での繰り返しを減らします。たとえば、例で 1 つのパス コンポーネントを変更するには、元の例では最大 3 つの個別の値を 1 つに変更する必要がありますが、変更された例では 1 つだけです。間違いがちな私の定期的な傾向を考えると、これは大きな勝利です。

最終的に私はこれを尋ねています: 標準ライブラリにこれを行うものはありますか、それとも私のプロジェクトのライブラリでその場所を見つける必要がありますか?

ヒットがミスを支配すると予想される場合

KeyErrorbrionius は、キャッチが機能することを正しく指摘しています。

try:
    print data[1]['i']['a']
except KeyError:
    print "Not found"

これが私の行く道かもしれません。それはかなり簡潔で、繰り返しをカットします。ただし、ミスよりもヒットの方が多いという前提が反映されています。反対のことを想定するより良い方法があれば、それも知りたいです。

4

3 に答える 3

4

このようなソリューションはクールです

https://twitter.com/raymondh/status/343823801278140417

>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict() 
>>> d['x']['y']['z'] = 10
>>> if d['x']['y']['z']: print d['x']['y']['z'] #better reflects that misses are common
于 2013-08-22T16:20:04.027 に答える