什么是从dict中获取项目的简单方法,如果没有找到,可以从另一个dict获得?

时间:2015-01-28 15:17:37

标签: python dictionary

我想从a获取一个值。如果无法在那里找到,请尝试从b获取。如果无法在b中找到,则抛出异常。

a.get(key, b[key])无法正常工作,因为它无法评估b[key]

正确的方法是什么?

以下工作但似乎有点冗长。

value = a.get(key, b.get(key, 'not found'))
if value == 'not found':
    raise Exception()

2 个答案:

答案 0 :(得分:12)

如果您使用的是3.3+,则可以使用ChainMap

from collections import ChainMap

a = {'a': 1}
b = {'b': 2}

# Add as many `dict`s as you want in order of priority...
chained = ChainMap(a, b)
print(chained['b'])

如果您只对检索感兴趣并且没有3.3+可用,那么您可以推出自己的辅助功能:

def whatever(key, *args):
    for mapping in args:
        try:
            return mapping[key]
        except KeyError:
            pass
    raise KeyError(key)

然后将其用作value = whatever('somekey', a, b)

答案 1 :(得分:6)

使用条件表达式,如下所示

a[key] if key in a else b[key]

如果您想避免错误,如果在两者中都找不到错误,您可以使用dict.get,就像这样

a[key] if key in a else b.get(key, <default_value>)

有一个丑陋的黑客,它使用一组词典来挑选最好的一个

(b, a)[key in a].get(key)

如果你想获得关键错误,你可以使它更奇怪,

(b, a)[key in a][key]

如果a确实位于key,这将选择a,因为布尔表达式等效于1(True)和0(False) 。因此,(b, a)[True]会选择aFalse会选择a