如何测试字典是否包含某些键

时间:2010-08-05 13:54:27

标签: python dictionary

如果字典包含多个键,是否有一个很好的方法来测试?

简短版本:

d = {}
if 'a' in d and 'b' in d and 'c' in d:
    pass #do something

感谢。

编辑:我只能使用python2.4 -.-

5 个答案:

答案 0 :(得分:21)

您可以使用set.issubset(...),如下所示:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> set(['a', 'b']).issubset(d)
True
>>> set(['a', 'x']).issubset(d)
False

Python 3引入了一个集合文字语法,该语法已被反向移植到Python 2.7,所以现在可以编写以上内容:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> {'a', 'b'}.issubset(d)
True
>>> {'a', 'x'}.issubset(d)
False

答案 1 :(得分:20)

if all(test in d for test in ('a','b','c')):
    # do something

答案 2 :(得分:5)

在Python3中你可以写

set("abc")<=d.keys()

在Python2.7中你可以写

d.viewkeys()>=set("abc")

当然,如果按键不是单个字符,则可以替换 set("abc")set(('a', 'b', 'c'))

。{

答案 3 :(得分:1)

可以使用包含在try / except。

中的itemgetter
>>> from operator import itemgetter
>>> d = dict(a=1,b=2,c=3,d=4)
>>> e = dict(a=1,b=2,c=3,e=4)
>>> getter=itemgetter('a','b','c','d')
>>> getter(d)
(1, 2, 3, 4)
>>> getter(e)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'

但实际上我更喜欢Paul McGuire的解决方案

答案 4 :(得分:1)

在2.4中,我总是将set操作用于此类目的。如果在某些预期的密钥丢失时值得警告(或其他类型的消息或异常),特别是,我这样做:

missing = set(d).difference(('a', 'b', 'c'))
if missing:
    logging.warn("Missing keys: %s", ', '.join(sorted(missing)))
else:
    ...
当然,

替换logging.warn调用(可能只是logging.info甚至logging.debug,也许是logging.error,也许是个例外)。

sorted部分主要是装饰性的(我喜欢可靠的,可重复的错误消息),但也有助于测试(当我模拟logging.warn - 或其他什么 - 在测试中,它很好能够期望一个特定的字符串,如果我没有对missing集进行排序,警告字符串可能会有所不同,当然,因为像dicts这样的集合没有顺序概念。)