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