我有一些python代码,如下所示:
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]
在我的生活中,我不能不使用列表理解来理解这些语法。请协助。
发布于 2016-06-24 07:41:24
直接翻译是
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])
it self是一个生成器,在python中,您可以将其检查为:
>>> y = (x for x in range(10))
>>> type(y)
<class 'generator'>
sum
可以像sum( (x for x in range(10)) )
和PEP289所说的那样,使用一个生成器
如果一个函数调用有一个位置参数,它可以是一个生成器表达式,没有额外的括号,但是在所有其他情况下,您都必须使用括号。
所以看起来像sum(x for x in range(10))
发布于 2016-06-24 07:35:32
与每次只向列表中的特定槽分配新值时重新创建nwalls
列表时,只需在列表中保留前一个值的记录,这样您就不会使用在循环中前面生成的值:
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]
如果您想完全避免理解,那么首先要知道,python与sum
内置的内容类似:
def sum(iterable):
s = 0
for n in iterable:
s+=n
return s
因此,nwalls[j] = sum(prev_nwalls[k] for k in mat[j])
行将被替换为如下所示:
s = 0
for k in mat[j]:
s+=nwalls[k]
nwalls[j] = s
https://stackoverflow.com/questions/38016898
复制