再帰と EAFP を含むアイデア。
def set_item(d, keys, value):
key = keys.pop(0)
try:
set_item(d[key], keys, value)
# IndexError happens when the pop fails (empty list), KeyError happens when it's not a dict.
# Assume both mean we should finish recursing
except (IndexError, KeyError):
d[key] = value
例:
>>> d = {'a': {'aa':1, 'ab':2}, 'b':{'ba':1, 'bb':2}}
>>> set_item(d, ['a', 'ab'], 50)
>>> print d
{'a': {'aa': 1, 'ab': 50}, 'b': {'ba': 1, 'bb': 2}}
編集: Marcin が以下で指摘しているように、Python には再帰制限があるため、これは任意にネストされた dict では機能しません。また、パフォーマンスが非常に重要な状況には適していません (Python の再帰は通常そうではありません)。reduce
それにもかかわらず、これらの 2 つの状況以外では、これはorを含むものよりもいくらか明確であることがわかりますlambda
。