编程语言
首页 > 编程语言> > 如何使用映射或过滤器而不是列表推导为特定值过滤嵌套字典(Python方式)?

如何使用映射或过滤器而不是列表推导为特定值过滤嵌套字典(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