如果字典包含多个键,是否有一个很好的方法来测试?
简短版本:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
感谢。
编辑:我只能使用python2.4 -.-
答案 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这样的集合没有顺序概念。)