当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《什么是从dict中获取项目的简单方法,如果没有找到,可以从另一个dict获得?》经验,为你挑选了2个好方法。

我想得到一个价值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()

Jon Clements.. 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> Jon Clements..:

如果您使用的是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)



2> thefourtheye..:

像这样使用条件表达式

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

如果你想避免错误,如果它们都没有找到,你可以dict.get像这样使用

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

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

(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.


Downvoter,如果你还在,请解释我如何改进这个答案.
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有