>>> d2
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2}
>>> d2.get('spamx',99)
99
>>> d2.get('ham')['fry']
6
I want to get value of fry inside of ham, if not, get value, 99 or 88 as the 2nd example. But how?
>>> d2
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2}
>>> d2.get('spamx',99)
99
>>> d2.get('ham')['fry']
6
I want to get value of fry inside of ham, if not, get value, 99 or 88 as the 2nd example. But how?
d2.get('ham', {}).get('fry', 88)
I would probably break it down into several statements in real life.
ham = d2.get('ham', {})
fry = ham.get('fry', 88)
d2.get('ham'...
returns something that is not a dict (if d2['ham']
was 'other'
say) –
Eohippus If you need to do this a lot, you can write a helper function
def get_nested(d, list_of_keys, default):
for k in list_of_keys:
if k not in d:
return default
d=d[k]
return d
print get_nested(d2,['ham','spam'],99)
print get_nested(d2,['ham','grill'],99)
functools.reduce(lambda d,x: d[x] if x in d else default, ['ham','spam'], d2)
–
Spiniferous TypeError
for ['bacon','spam']
–
Quandary For the default values of get to work correctly the first default needs to be a dictionary, so that you can chain the .get calls correctly if the first fails.
d.get('ham',{}).get('fry',88)
you could also use a try, except block
def get_ham_fry()
try:
return d['ham']['fry']
except AttributeError,e:
return 88
KeyError
if no key is found, or a TypeError
if the item doesn't support string indexing. I think AttributeError
is only appropriate for the get
calls. –
Eohippus Here's a solution for dealing with nested dictionaries:
def get(root, *keys):
"""
Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices.
Returns None otherwise
"""
if not keys:
return root
if keys[0] not in root:
return None
if keys[0] in root:
return get(root[keys[0]], *keys[1:])
Usage:
>>> d = {'a': 1, 'b': {'c': 3}}
>>> get(d, 'b', 'c')
3
>>> get(d. 'key that's not in d')
None
>>> get(d)
{'a': 1, 'b': {'c': 3}}
another solution for the issue could be:
from 'ham' get 'fry' else return 88
result = d2['ham'].get('fry', 88)
© 2022 - 2024 — McMap. All rights reserved.
d2.get('ham', {}).get('fry', 99)
, not ? (DRY!) – Stipulation