在另一个filter()中使用过滤器函数

问题描述 投票:0回答:2

我想列出在shopCart中有东西的成员列表。请参见下面的示例:

users=[
    {"name":"John","age":18,"shopCart":["Python","Csharp","Java"]},
    {"name":"Ellen","age":19,"shopCart":[]},
    {"name":"Eric","age":21,"shopCart":["Python","Java"]},
    {"name":"Jennifer","age":20,"shopCart":[]}
    ]
buyUsers = map(lambda user:user["name"], filter(lambda user:user["shopCart"],users))
print(list(buyUsers))
['John','Eric']

上面的代码运行良好,并给出了我想要的答案,但是我在互联网上找到了它。我的问题是,为什么不能用filter()代替map(),换句话说,为什么下面的代码不仅仅给出在shopCart中有东西的用户的名字?

 buyUsers = filter(lambda user:user["name"], filter(lambda user:user["shopCart"],users))
 print(list(buyUsers))
 [{'shopCart': ['Python', 'Csharp', 'Java'], 'name': 'John', 'age': 18}, {'shopCart': 
 ['Python', 'Java'], 'name': 'Eric', 'age': 21}]  
python dictionary lambda filter
2个回答
0
投票

filter应始终返回列表中符合条件的项目,因此,您将像获得的一样获得整个项目。但是,在map中,您可以应用其他操作,例如上述名称的提取。


0
投票

您在互联网上找到的代码:

buyUsers = map(lambda user:user["name"], filter(lambda user:user["shopCart"],users))

说:在所有users中找到那些在user["shopCart"]中有东西的东西,然后只给我user["name"]

您的修改:

buyUsers = filter(lambda user:user["name"], filter(lambda user:user["shopCart"],users))

说:在所有的users中找到那些在user["shopCart"]中具有某些内容的对象,然后在其中users中返回一个user["name"]

总之,您的第二个过滤器不执行任何操作(就您提供的数据而言),而是使所有用户通过。

© www.soinside.com 2019 - 2024. All rights reserved.