这是我目前的一线:
leader = [server.get_member(x) for x in self.rosters[server.id][clan]['members'] if discord.utils.get(server.get_member(x).roles, id="463226598351699968")]
我只想在server.get_member(x)
不是False
的情况下运行它。如何将这种额外的逻辑添加到列表理解中?我了解如何执行基本的for
in
语句,但是将其嵌套得比该语句更深会使我感到困惑。
答案 0 :(得分:4)
通常,不要为了编写单行代码而牺牲可读性。如果尚不很清楚如何使用列表理解方法,请使用for循环。
leader = []
for x in self.rosters[server.id][clan]['members']:
member = server.get_member(x)
if member and discord.utils.get(member.roles, id="463226598351699968"):
leader.append(member)
尽管在这种特定情况下,由于不需要x
,因此可以在迭代时使用map
来应用server.get_member
。
leader = [m for m in map(server.get_member, self.rosters[server.id][clan]['members'])
if m and discord.utils.get(m.roles, id="463226598351699968")]
答案 1 :(得分:2)
不能。列表理解中的项目无法保存,因此您必须对其进行两次评估。即使可以,不要。列表推导用于过滤,而不是作为副作用运行代码。这是不可读的,容易出错。
答案 2 :(得分:1)
通常,您可以通过迭代一个1元组的嵌套列表理解来实现临时变量赋值的效果:
leader = [m for x in self.rosters[server.id][clan]['members'] for m in (server.get_member(x),) if m and discord.utils.get(m.roles, id="463226598351699968")]
但是在这种特殊情况下,正如@OlivierMelançon在评论中指出的那样,由于附加赋值只是将值映射到函数调用,因此可以使用map
函数获得所需的结果:>
leader = [m for m in map(server.get_member, self.rosters[server.id][clan]['members']) if m and discord.utils.get(m.roles, id="463226598351699968")]
答案 3 :(得分:-1)
虽然我同意以下建议,但建议您不要将此作为对可读性的理解而写:
leader = [server.get_member(x) for x in self.rosters[server.id][clan]['members'] if discord.utils.get(server.get_member(x).roles, id="463226598351699968") if server.get_member(x)]
类似于this的答案。