I\'ve a nested dictionary.
>>> foo = {\'m\': {\'a\': 10}, \'n\': {\'a\': 20}}
>>>
I\'d like to filter specific values, b
A list comprehension can do this beautifully.
>>> foo = {'m': {'a': 10}, 'n': {'a': 20}}
>>> [v for v in foo.values() if 10 in v.values()]
[{'a': 10}]
You don't need the for loop or the list comprehension if you are matching against a known key in the dictionary.
In [15]: if 10 in foo['m'].values():
...: result = [foo['m']]
...:
In [16]: result
Out[16]: [{'a': 10}]
If you want to return the full nested dictionary if it contains a
, a list comprehension is probably the cleanest way. Your initial list comprehension would work:
[foo[n] for n in foo if foo[n]['a'] == 10]
You can also avoid the lookup on n
with:
[d for d in foo.values() if d['a'] == 10]
List comprehensions are generally considered more Pythonic than map
or filter
related approaches for simpler problems like this, though map
and filter
certainly have their place if you're using a pre-defined function.
This gives me the desired values but I'm not sure if iterating over values of a dictionary is a good/pythonic approach.
If you want to return all values of a dictionary that meet a certain criteria, I'm not sure how you would be able to get around not iterating over the values of a dictionary.
For a filter-based approach, I would do it as:
list(filter(lambda x: x['a'] == 10, foo.values()))
There's no need for the if-else
in your original code.