mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
for i in range(1,3):
nwalls = [sum(nwalls[k] for k in mat[j]) for j in range(5)]
# nwalls = [1, 2, 2, 1, 2]
mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
for i in range(1, 3):
_nwalls = []
for j in range(5):
tot = 0 # - sum
for k in mat[j]: # /
tot += nwalls[k] # /
_nwalls.append(tot)
nwalls = _nwalls
(nwalls[k] for k in mat[j])它本身是一个生成器,在python repl中,可以将其检查为:
^{pr2}$
并且sum可以取一个生成器,如sum( (x for x in range(10)) ),和{a1}所说
if a function call has a single positional argument, it can be a generator expression without extra parentheses, but in all other cases you have to parenthesize it.
mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
prev_nwalls = 5*[1]
for _ in range(1,3):
for j in range(5):
nwalls[j] = sum(prev_nwalls[k] for k in mat[j])
prev_nwalls[:] = nwalls
assert nwalls == [1, 2, 2, 1, 2]
如果您想完全避免理解,首先要知道与sum内建函数等价的python如下所示:
^{pr2}$
因此nwalls[j] = sum(prev_nwalls[k] for k in mat[j])行将替换为如下内容:
直接翻译就是
^{pr2}$(nwalls[k] for k in mat[j])
它本身是一个生成器,在python repl中,可以将其检查为:并且
sum
可以取一个生成器,如sum( (x for x in range(10)) )
,和{a1}所说所以看起来是
sum(x for x in range(10))
不要每次都重新创建
nwalls
列表,只需为列表中的特定槽指定一个新值,而是在列表中保留以前的值的记录,这样就不会使用循环中先前生成的值:如果您想完全避免理解,首先要知道与
^{pr2}$sum
内建函数等价的python如下所示:因此
nwalls[j] = sum(prev_nwalls[k] for k in mat[j])
行将替换为如下内容:相关问题 更多 >
编程相关推荐