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