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

我想要一份在他们的 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}]  


隔江千里
浏览 89回答 2
2回答

白衣非少年

您在互联网上找到的代码: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

智慧大石

filter应始终返回列表中符合条件的项目,因此,您将获得所有项目。但是,在 中map,您可以应用另一个操作,如上面提取名称。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python