是否有一种好的方法来测试字典是否包含多个键?
简短版:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
谢谢。
编辑:我只能使用Python2.4 -.-
是否有一种好的方法来测试字典是否包含多个键?
简短版:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
谢谢。
编辑:我只能使用Python2.4 -.-
您可以使用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
if all(test in d for test in ('a','b','c')):
# do something
set("abc")<=d.keys()
d.viewkeys()>=set("abc")
set("abc")
替换为set(('a', 'b', 'c'))
。可以使用一个包含在 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的解决方案
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
集合进行排序,则警告字符串可能会因为集合和字典一样没有顺序概念而发生变化)。