Python中Lambda过滤一个字典列表

4

我最近开始学习Python编程,对于字典有些疑问。

我有一个数组,并且已经有了一个可以获取id数组的方法,我尝试使用lambda创建了一个过滤后的列表,我的问题是除了过滤后的列表外,我是否可以在列表中仅留下必要的属性,如示例所示。

示例:

 ages = [{'employedId': 1, 'age': 22},
         {'employedId': 2, 'age': 32},
         {'employedId': 3, 'age': 17},
         {'employedId': 4, 'age': 53},
         {'employedId': 5, 'age': 32},
         {'employedId': 6, 'age': 22}
         ]
list_filtred = list(filter(lambda tag: tag['age'] == 22, ages))

Python 输出

[{'employedId': 1, 'age': 22}, 
 {'employedId': 6, 'age': 22}]

我能否创建一个lambda过滤方法来获得这样的输出,还是我必须在数组上工作以创建一个新值列表?

期望的输出

[1,6]
3个回答

6

在使用'age'进行过滤之后,您可以使用列表推导式来访问相应于'employedId'键的值。

>>> [tag['employedId'] for tag in ages if tag['age'] == 22]
[1, 6]

非常感谢,我不知道会有这样的可能性。 - Mateus Silva

2
filter 函数本身不会做到这一点,但您可以使用函数式、声明式风格(而不是命令式)来实现。例如,要提取所有年龄为 22 岁的人。
list_filtered = list(filter(lambda tag: tag['age']==22, ages))

Lambda函数是强大的工具;您可以构造各种条件。
要获得所需格式的数组,请尝试使用map函数,该函数使用类似的原理,但不是过滤数组,而是将函数的结果应用于数组中的每个项。
list_filtered = list(map(lambda x: x['employedId'], ages))

小心,map 不会返回一个 list,而是一个迭代器。 - C.Nivs

2
作为替代方案,您可以利用现有的list语句,并添加一个map语句来获取employedId键。
from operator import itemgetter

list(map(itemgetter('employedId'), filter(lambda tag: tag['age'] == 22, ages)))
[1, 6]

否则,我认为@CoryKramer的答案更易读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接