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

时间:2019-02-15 20:31:11

标签: python list-comprehension

这是我目前的一线:

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

4 个答案:

答案 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的答案。