我想在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]
但是我收到了无效的语法错误,我怎样才能将两个变量c
和i
传递给lambda
然后在两个索引处操作列表。
这是一种更加抒情的做法吗?
有人可以建议更短的代码吗?
我想只使用列表理解。如何使用列表推导实现上述代码?
答案 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实践)将它们与函数一起使用有副作用。