How to filter a nested dictionary (pythonic way) for a specific value using map or filter instead of list comprehensions?

只谈情不闲聊 提交于 2019-12-01 06:29:12

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!