Python 计算量大的列表理解

Python 计算量大的列表理解,python,list-comprehension,Python,List Comprehension,因此,我有一些列表理解,如下所示 li = [some_computation(x) for x in y if some_computation(x)] 在这里,我只想要关于某些计算的真实值 这个计算是否是列表理解所显示的两倍?如果某些计算很昂贵,我真的不想要这个。(我觉得可能是这样的:() 有没有更好的方法来实现这一点?如果只有一些计算(x),也许可以将其分解为一个常规for循环并附加,但我喜欢理解 某些_计算将计算两次,为了避免这种情况,您可以使用过滤器放弃错误结果: li = list

因此,我有一些列表理解,如下所示

li = [some_computation(x) for x in y if some_computation(x)]
在这里,我只想要关于
某些计算的真实值

  • 这个计算是否是列表理解所显示的两倍?如果
    某些计算
    很昂贵,我真的不想要这个。(我觉得可能是这样的:(
  • 有没有更好的方法来实现这一点?如果只有
    一些计算(x)
    ,也许可以将其分解为一个常规for循环并附加,但我喜欢理解

  • 某些_计算
    将计算两次,为了避免这种情况,您可以使用
    过滤器
    放弃错误结果:

    li = list(filter(None, (some_computation(x) for x in y)))
    
    或者使用Jon Clements建议的嵌套生成器表达式:

    li = [el for el in (some_computation(x) for x in y) if el]
    
  • 这计算出的某些_计算(x)是列表理解看起来的两倍吗
  • 是的,它计算两次

  • 有没有更好的方法来实现这一点?也许可以将它分解成一个规则的for循环,并在某些计算(x)时追加,但我喜欢理解
  • 你必须进行常规循环。生成器是动态的,没有存储。也许你可以使用选择x的算法进行计算

    li = [computation(x) for x in y if choose(x)]
    
    或者您必须在if条件下进行迭代,这相当于调用计算两次

  • 是的,它会执行两次_计算,请尝试此操作并查看:

    def compute(x):
        print("Compute...")
        return 2*x
    y=[1,3,5]
    ls=[compute(x) for x in y if compute(x)]
    
  • 输出:

    Compute...
    Compute...
    Compute...
    Compute...
    Compute...
    Compute...
    
  • 更好的Python方式:

    ls=[x代表x in[计算(z)代表y中的z]如果x]


  • 这已经出现过几次了,但似乎找不到它…无论如何…您可以在列表comp中嵌套一个gen exp,例如:
    li=[el代表el in(some_func(x)代表x in y),如果el]
    …是的,
    某些计算
    函数将在Python 2.x和3中计算两次。x@JonClements我想我在这里找到了:谢谢你的回答!