Python - Filter和Lambda初学者问题



我正在通过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)

相关内容

  • 没有找到相关文章

最新更新