将两个参数传递给lambda python

时间:2012-02-17 16:42:05

标签: python

我想在python中进行简单的列表操作: 这是我使用两个for循环的方式:

lst = []
coins = [1, 2, 5, 10, 20, 50, 100, 200]
maxi = 200
lst = lst + [0]*(maxi+5)
lst[0] = 1

for c in coins:
    for i in range(c, maxi+2):
        lst[i] += lst[i-c]

上面的代码给了我想要的结果,现在我尝试将两个线路循环转换成一个单行

add = lambda i, c: lst[i] += lst[i-c]
[add(i, c) for i in range(c, maxi+1) for c in coins]

但是我收到了无效的语法错误,我怎样才能将两个变量ci传递给lambda 然后在两个索引处操作列表。

这是一种更加抒情的做法吗?

有人可以建议更短的代码吗?

我想只使用列表理解。如何使用列表推导实现上述代码?

3 个答案:

答案 0 :(得分:6)

我认为你所拥有的双循环非常好 - 为什么你想要一个更短的版本?

您得到的错误是因为您在lambda函数中放置了语句,其中只允许表达式。你可以将其写为列表理解 - 类似于(未经测试的)

[lst.__setitem__(i, lst[i] + lst[i - c]) 
 for c in coins for i in range(c, maxi+1)]

但是认真 - 你为什么要这样?除了模糊之外,它还会创建一个毫无意义的None值列表。

我对代码的唯一改变是lst的初始化,奇怪地分布在三行上。以下几行就足够了:

lst = [1] + [0] * (maxi + 4)

答案 1 :(得分:2)

这是因为python中的+=是一个语句而不是表达式 - 它不会返回任何值。 lambdas必须只包含python中的表达式。

答案 2 :(得分:1)

不要使用列表理解 - 这只是做Pythonic

for c in coins:
    for i in range(c, maxi + 1):
        lst[i] += lst[i - c]

ETA:原因是列表推导意味着用于返回值的函数(最终以列表结尾) - 没有必要(并且违反functional programming实践)将它们与函数一起使用有副作用。