我正在通过Colt Steele现代Python训练营学习Python。我现在在过滤器部分,我在理解这个方面有困难或者我猜我在理解列表和字典方面有困难。
在视频中它显示了一个字典列表
users = [
{"username":"samuel", "tweets": ["blabla"]},
{"username":"test", "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循环实现的呢,因为我不知道。我尝试了不同的for循环。
我得到的是一个空的[]
Thanks in advance
正确的做法是:
inaktiv = []
for u in users:
if len(u["tweets"]) == 0:
inaktiv.append(u)
如果你有C背景,并且你非常习惯使用带索引的循环来访问数组元素,那么你可能会发现这个解决方案更容易理解(但它不是python的,也不是推荐的):
inaktiv = []
for index in range(len(users)):
if len(users[index]["tweets"]) == 0:
inaktiv.append(users[index])
相反,使用列表推导式会更好:
inaktiv = [u for u in users if len(u["tweets"]) == 0]
另外,请记住len(u["tweets"]) == 0
具有与not u["tweets"]
相同的效果(在本例中),因此您可以将整个代码缩短一点:
inaktiv = [u for u in users if not u["tweets"]]
我在代码中检测到的第一个问题是您的索引增加是在您的if条件下。这意味着如果用户中的第一个人是活动的,索引将不会增加。因此,您将得到一个空的非活动人员列表。
我想你想达到这样的效果:
users = [
{"username": "samuel", "tweets": []},
{"username":"toni","tweets": ["blabla"]},
{"username": "tata", "tweets": []},
{"username":"hHh","tweets": ["abba"]},
{"username": "SAEl", "tweets": []},
{"username":"brte","tweets": ["abba"]}
]
inactive = []
for user in users:
if len(user['tweets']) == 0: # also you can use: if not user['tweets']
inactive.append(user)
print(inactive)
值得注意的是,你已经接近目标了。代码的问题在于,只有在数组为空时才对索引进行递增。问题修复如下:
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)