如何使用映射或过滤器而不是列表推导为特定值过滤嵌套字典(Python方式)?
作者:互联网
我有一本嵌套的字典.
>>> foo = {'m': {'a': 10}, 'n': {'a': 20}}
>>>
我想根据“ a”的值过滤特定的值.
我可以为此目的使用列表推导.
>>> [foo[n] for n in foo if foo[n]['a'] == 10]
[{'a': 10}]
>>>
如预期的那样,仅使用list可以给我foo中的元素(而不是元素的值):
>>> list(filter(lambda x: foo[x] if foo[x]['a']==10 else None,foo))
['m']
>>>
使用地图会返回不需要的“无”值:
>>> list(map(lambda x: foo[x] if foo[x]['a']==10 else None,foo))
[{'a': 10}, None]
>>>
结合这两个,我可以获取所需的值.但是我想foo被迭代了两次-一次用于过滤器和映射.列表理解解决方案只需要我重复一次即可.
>>> list(map(lambda t: foo[t], filter(lambda x: foo[x] if foo[x]['a']==10 else None,foo)))
[{'a': 10}]
>>>
这是仅使用过滤器的另一种方法.这给了我想要的值,但是我不确定在字典的值上进行迭代是否是一种好方法/ pythonic方法:
>>> list(filter(lambda x: x if x['a'] == 10 else None, foo.values()))
[{'a': 10}]
>>>
我想知道是否:
>这种情况下的pythonic /推荐方法是什么?
>是否可以接受在字典值上使用过滤器的最后一个示例?
问候
沙拉德
解决方法:
列表理解可以做到这一点.
>>> foo = {'m': {'a': 10}, 'n': {'a': 20}}
>>> [v for v in foo.values() if 10 in v.values()]
[{'a': 10}]
如果您与字典中的已知键匹配,则不需要for循环或列表理解.
In [15]: if 10 in foo['m'].values():
...: result = [foo['m']]
...:
In [16]: result
Out[16]: [{'a': 10}]
标签:python-3-5,list,dictionary,python,list-comprehension 来源: https://codeday.me/bug/20191026/1938807.html