Python对所有列表元素执行操作,并使用列表理解在输出中只包含一些元素
我有以下功能,工作正常:Python对所有列表元素执行操作,并使用列表理解在输出中只包含一些元素,python,list-comprehension,Python,List Comprehension,我有以下功能,工作正常: output = [] for a, b in itertools.product( list_a, list_b ): x= perform_action(a,b) if b.relevant: output.append(x) return output 如果可能的话,我如何使用列表理解重写这个 简而言之,我想要的是对所有项目执行操作,并且只在输出中包含相关的项目 可复制示例: from itertools import
output = []
for a, b in itertools.product(
list_a, list_b
):
x= perform_action(a,b)
if b.relevant:
output.append(x)
return output
如果可能的话,我如何使用列表理解重写这个
简而言之,我想要的是对所有项目执行操作
,并且只在输出中包含相关的项目
可复制示例:
from itertools import product
a = [2,3,4]
b = ["a","b"]
def foo(p,r):
out = "{0}---{1}".format(p,r)
print(out)
return out
li = [foo(p,r) for p,r in product(a,b) if p>3]
print(li)
你对列表理解的两个层次有何感受
return [x for b, x in [(b, perform_action(a,b)) for a,b in itertools.product(l_a, l_b)] if b.relevant]
我知道您不是来这里寻求代码可读性建议的,但是,不要将其转化为列表理解,它的可读性远不如列表理解。如果你想提高记忆效率,就做一个生成器。你对两层列表理解的感觉如何
return [x for b, x in [(b, perform_action(a,b)) for a,b in itertools.product(l_a, l_b)] if b.relevant]
我知道您不是来这里寻求代码可读性建议的,但是,不要将其转化为列表理解,它的可读性远不如列表理解。如果你想提高内存效率,就做一个生成器。很难说--是否执行动作变异
b.相关
?如果没有,只需[在itertools.product中为a,b执行操作(a,b)(如果b.相关,则列出a,列出b)]
就可以了?您只需在末尾添加一个If
条件,如fish\u list=[fish for fish\u tuple If fish!=“octopus”]
这是我从示例中得到的。通常,使用列表理解来处理副作用是个坏主意。理解通常对应于映射
转换,而for
-循环对应于命令式操作。请注意,如果b.relevant将添加到列表理解中,则不会为此执行操作(A,b)
。这是可取的吗?执行动作
有副作用(变异b.relevant
)可能是潜在的问题,听起来你可能有一个脆弱的设计。如果你总是需要执行动作
,那么从可读性/逻辑的角度来看,假设效率不是问题,那么分两步执行可能更有意义。很难说--是否执行动作
变异相关
?如果没有,只需[在itertools.product中为a,b执行操作(a,b)(如果b.相关,则列出a,列出b)]
就可以了?您只需在末尾添加一个If
条件,如fish\u list=[fish for fish\u tuple If fish!=“octopus”]
这是我从示例中得到的。通常,使用列表理解来处理副作用是个坏主意。理解通常对应于映射
转换,而for
-循环对应于命令式操作。请注意,如果b.relevant
将添加到列表理解中,则不会为此执行操作(A,b)
。这是可取的吗?执行动作
有副作用(变异b.relevant
)可能是潜在的问题,听起来你可能有一个脆弱的设计。如果您总是需要执行_action
,那么从可读性/逻辑的角度来看,如果效率不是问题,分两步执行可能更有意义。内部理解可以转化为生成器表达式以减少内存占用。@MisterMiyagi这是什么样子?你是否只需要打开内部理解的[]
?返回[x代表b,x代表a,b代表产品(…),如果b.相关]
哇,我会假设这只是一个元组,TIL。感谢@chepnerNo,元组(空元组除外)由逗号创建;括号仅用于防止逗号被解释为其他内容。(例如,双参数函数调用f(1,2)
与单参数函数调用f((1,2))
)内部理解可以转化为生成器表达式以减少内存占用。@MisterMiyagi这是什么样子的?你是否只需要打开内部理解的[]
?返回[x代表b,x代表a,b代表产品(…),如果b.相关]
哇,我会假设这只是一个元组,TIL。感谢@chepnerNo,元组(空元组除外)由逗号创建;括号仅用于防止逗号被解释为其他内容。(例如,双参数函数调用f(1,2)
与单参数函数调用f((1,2))
)