简体   繁体   English

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

[英]Making a complicated list comprehension conditional

Here is my current one-liner: 这是我目前的一线:

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

I want to only run this if server.get_member(x) is not False . 我只想在server.get_member(x)不是False下运行它。 How can I add this extra logic into this list comprehension? 如何将这种额外的逻辑添加到列表理解中? I understand how to do a basic for in statement, but nesting it deeper than that becomes a bit confusing for me. 我知道如何for in语句做一个基础,但是将其嵌套得比之更深会使我感到困惑。

In general, do not sacrifice readability for the sake of writing a one-liner . 通常, 不要为了编写单行代码而牺牲可读性 If it not immediately obvious how to do it with a list-comprehension, then use a for-loop. 如果不是很明显如何使用列表理解方法,请使用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)

Although, in this specific case, since you do not need x , you can use map to apply server.get_member while iterating. 尽管在这种特定情况下,由于不需要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")]

You can't. 你不能 The item in list comprehension can't be saved, so you'll have to evaluate it twice. 列表理解中的项目无法保存,因此您必须对其进行两次评估。 Even if you could, don't . 即使可以, 也不要 List comprehensions are for filtering, not for running code as side effect. 列表推导用于过滤,而不是作为副作用运行代码。 It's unreadable and prone to mistakes. 这是不可读的,容易出错。

In general, you can achieve the effect of a temporary variable assignment with a nested list comprehension that iterates through a 1-tuple: 通常,您可以通过迭代一个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")]

But in this particular case, as @OlivierMelançon pointed out in the comment, since the additional assignment is simply mapping a value to a function call, you can achieve the desired result with the map function instead: 但是在这种特殊情况下,正如@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")]

While I agree with the comments suggesting you should not write this as a comprehension for readability you could try: 尽管我同意建议您不将此写成对可读性的理解的意见,但您可以尝试:

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

Similar to this answer. 答案相似。

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

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