如何测试一个字典是否包含特定的键

9

是否有一种好的方法来测试字典是否包含多个键?

简短版:

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

谢谢。

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

5个回答

23

您可以使用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

set(sub_dict).issubset(parent_dict) 似乎也可以工作,并且对我来说更简单。但是感谢您的指引 :) - trojjer

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

6
在Python3中,您可以编写:
set("abc")<=d.keys()

在Python2.7中,您可以编写如下代码:
d.viewkeys()>=set("abc")

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

很遗憾,我只能在我们的生产服务器上使用 Python 2.4,这虽然有些遗憾,但也是可以处理的。 - AkaBkn
如果有人后来使用Python 2.7+,为了完整性缘由,请将以下与编程有关的内容翻译成中文。请只返回翻译后的文本。 - Wayne Werner

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的解决方案


1
在2.4中,我总是使用集合操作来实现这样的目的。如果缺少某些期望的键值对需要发出警告(或其他类型的消息或异常),特别是我会执行以下操作:
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集合进行排序,则警告字符串可能会因为集合和字典一样没有顺序概念而发生变化)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接