我想列出在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}]
filter
应始终返回列表中符合条件的项目,因此,您将像获得的一样获得整个项目。但是,在map
中,您可以应用其他操作,例如上述名称的提取。
您在互联网上找到的代码:
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"]
总之,您的第二个过滤器不执行任何操作(就您提供的数据而言),而是使所有用户通过。