为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2022-12-27 15:18:24
我想要一份在他们的 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']上面的代码运行良好并给出了我想要的答案,但我是在互联网上找到的。我的问题是为什么不能使用 thisfilter()而不是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}]  
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超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))

说:在所有的usersfind 中,找到那些在 中有东西的user["shopCart"],然后在那些中,返回users一个user["name"]


简而言之,您的第二个过滤器什么都不做(在您提供的数据的情况下)但让所有用户通过。


您可能缺少的关键信息是考虑了空项falsy。请参阅下面的示例代码:


items = ["a", "", [1], []]

for item in items:

    print(item, bool(item))

输出:


a True

 False

[1] True

[] False


查看完整回答
反对 回复 2022-12-27
?
智慧大石

TA贡献1946条经验 获得超3个赞

filter应始终返回列表中符合条件的项目,因此,您将获得所有项目。但是,在 中map,您可以应用另一个操作,如上面提取名称。



查看完整回答
反对 回复 2022-12-27
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信