Python列表的Sum理解

2024-10-01 19:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些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]

在我的一生中,如果不使用列表理解来理解它,我就无法将其展开成语法。请协助。在


Tags: 代码in列表for语法rangesummat
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.

所以看起来是sum(x for x in range(10))

不要每次都重新创建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]

如果您想完全避免理解,首先要知道与sum内建函数等价的python如下所示:

^{pr2}$

因此nwalls[j] = sum(prev_nwalls[k] for k in mat[j])行将替换为如下内容:

s = 0
for k in mat[j]:
    s+=nwalls[k]
nwalls[j] = s

相关问题 更多 >

    热门问题