Is there a nice approach to test if a dictionary contains multiple keys?
A short version of:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
Thanks.
Edit: I can only use python2.4 -.-
Is there a nice approach to test if a dictionary contains multiple keys?
A short version of:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
Thanks.
Edit: I can only use python2.4 -.-
Could use an itemgetter wrapped in a try / except.
>>> 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'
But actually I prefer Paul McGuire's solution
In Python3 you can write
set("abc")<=d.keys()
In Python2.7 you can write
d.viewkeys()>=set("abc")
of course if the keys are not single chars you can replace
set("abc")
with set(('a', 'b', 'c'))
You can use set.issubset(...)
, like so:
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> set(['a', 'b']).issubset(d)
True
>>> set(['a', 'x']).issubset(d)
False
In 2.4, I always use set operations for such purposes. If it's worth a warning (or other kind of msg or exception) when some expected keys are missing, in particular, I do:
missing = set(d).difference(('a', 'b', 'c'))
if missing:
logging.warn("Missing keys: %s", ', '.join(sorted(missing)))
else:
...
replacing the logging.warn
call as appropriate, of course (maybe just logging.info or even logging.debug, maybe logging.error, maybe an exception).
The sorted
part is mostly cosmetic (I like reliable, repeatable error messages) but also helps a bit with testing (when I mock up logging.warn -- or whatever -- in the tests, it's nice to be able to expect a specific string, and if I didn't sort the missing
set the warning string might vary, of course, since sets, like dicts, don't have a concept of order).