繁体   English   中英

使复杂的列表理解成为条件

[英]Making a complicated list comprehension conditional

这是我目前的一线:

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语句做一个基础,但是将其嵌套得比之更深会使我感到困惑。

通常, 不要为了编写单行代码而牺牲可读性 如果不是很明显如何使用列表理解方法,请使用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元组的嵌套列表理解来实现临时变量赋值的效果:

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")]

尽管我同意建议您不将此写成对可读性的理解的意见,但您可以尝试:

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)]

答案相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM