Python 列表理解中的赋值

问题描述 投票:0回答:4

我正在寻找一种在列表理解中完成作业的方法。我想将下面的代码重写为列表理解。

我有这个“昂贵”的功能:

import time
def f(x):
    time.sleep(1)
    return x + 1

这个循环:

l = []
for value in [1, 2, 3]:
    x = f(value)
    l.append(x + x)

我想将其重写为列表理解:

l = [
     f(value) + f(fvalue)
     for value in [1, 2, 3]
]

但是由于调用

f(value)
的成本很高,我想尽量减少调用次数(以下代码片段不会运行):

l = [
     (x = f(value))
     x + x
     for value in [1, 2, 3]
]

我已经阅读了有关赋值表达式(

:=
)(https://www.python.org/dev/peps/pep-0572/#changing-the-scope-rules-for-compressives)但我似乎无法弄清楚。

python python-3.x list-comprehension
4个回答
2
投票

我的方法是嵌套多个列表理解,例如

l_new = [x * x * y for x, y in [f(value) for value in [1, 2, 3]]]

因此

f()
对于每个值只能调用一次。


0
投票

这是另一种伪造方法:

[x+x for value in [1, 2, 3] for x in [f(value)]]

0
投票

这是我最近一直在使用的方法。它不是最漂亮的,但对我来说,它最接近匿名函数的映射(如 Scala 或 TypeScript):

l = [
  (
    x := f(value),
    x + x
  )[-1] for value in [1, 2, 3]
]

基本上,我们只是创建一个元组并返回最后一个元素。


-1
投票

这可以由海象操作员来完成。请注意,您需要 Python 3.8 或更高版本。

l = [x:=10 * value for value in [1, 2, 3]]

具有一快一慢功能。

import time

def slow_function(a):
    time.sleep(1)
    return a + 1

def fast_function(b):
    return b + b  


l = [
     fast_function(x := slow_function(value))
     for value in [1, 2, 3]
]

在这两个示例中都可以跳过海象运算符,但也许真正的问题需要它。

© www.soinside.com 2019 - 2024. All rights reserved.