Python如何用for循环实现filter+lambda筛选无推文非活跃用户
问题描述
学习Colt Steele的Modern Python Bootcamp课程Python内容,推进到filter章节时遇到实操障碍,判断是自身对列表、字典的基础掌握不牢导致。
课程给出的示例数据为存储用户信息的字典列表:
users = [ {"username":"samuel", "tweets": ["blabla"]}, {"username":"test", "tweets": []} ]
课程示例通过如下代码分离非活跃用户(判定规则:tweets键对应值为空列表):
inactive_users = list(filter(lambda u:len(u["tweets"]) == 0, users))
上述代码可正常运行,为巩固知识点尝试用for循环实现同等功能时始终出错,自行编写的代码运行后仅返回空列表[],错误代码如下:
users = [ {"username": "samuel", "tweets": []}, {"username":"toni","tweets": ["blabla"]}, {"username": "tata", "tweets": []}, {"username":"hHh","tweets": ["abba"]}, {"username": "SAEl", "tweets": []}, {"username":"brte","tweets": ["abba"]} ] inaktiv = [] index = 0 for u in users: if len(users[index]["tweets"]) == 0: inaktiv.append(u) index += 1 print(inaktiv)
核心诉求:通过for循环正确实现非活跃用户筛选功能。
错误原因
代码逻辑bug出在index变量的累加位置:
index += 1被写在了if判断的代码块内部,只有判定为非活跃用户时,索引才会自增- 测试数据第一个用户samuel的tweets为空,第一次循环index=0,判定成立,samuel被加入结果列表后index变为1;第二次循环遍历到用户toni,其tweets非空,if条件不触发,index就会永久停在1不再变化,后续所有循环都在重复判断索引1对应的toni账号,自然无法得到正确结果。
正确实现方案
以下两种for循环写法都可以实现和filter示例完全一致的筛选效果:
写法1:直接遍历元素(推荐)
for u in users循环中,u本身就是当前轮次拿到的用户字典,不需要额外通过索引取值,逻辑最简洁不易出错:
users = [ {"username": "samuel", "tweets": []}, {"username":"toni","tweets": ["blabla"]}, {"username": "tata", "tweets": []}, {"username":"hHh","tweets": ["abba"]}, {"username": "SAEl", "tweets": []}, {"username":"brte","tweets": ["abba"]} ] inaktiv = [] for u in users: # 直接判断当前用户的tweets长度即可 if len(u["tweets"]) == 0: inaktiv.append(u) print(inaktiv)
运行输出结果:
[{'username': 'samuel', 'tweets': []}, {'username': 'tata', 'tweets': []}, {'username': 'SAEl', 'tweets': []}]
写法2:索引遍历写法
如果要通过索引访问列表元素,必须把index自增逻辑放在if判断外部,保证每轮循环不管是否命中筛选条件,索引都会正常向后移动:
inaktiv = [] index = 0 for u in users: if len(users[index]["tweets"]) == 0: inaktiv.append(u) # 索引自增和if判断无关,每轮循环必执行 index += 1 print(inaktiv)
如果需要同时用到索引和元素值,优先用enumerate实现,不需要手动维护index变量,从根源避免累加位置写错的问题:
inaktiv = [] for idx, u in enumerate(users): if len(users[idx]["tweets"]) == 0: inaktiv.append(u)
内容的提问来源于stack exchange,提问作者cinikbrate
相关产品推荐
相关产品推荐

