首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用求和理解Python列表

用求和理解Python列表
EN

Stack Overflow用户
提问于 2016-06-24 15:23:44
回答 2查看 2.3K关注 0票数 1

我有一些python代码,如下所示:

代码语言:javascript
运行
复制
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]

在我的生活中,我不能不使用列表理解来理解这些语法。请协助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 15:41:24

直接翻译是

代码语言:javascript
运行
复制
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中,您可以将其检查为:

代码语言:javascript
运行
复制
>>> 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))

票数 3
EN

Stack Overflow用户

发布于 2016-06-24 15:35:32

与每次只向列表中的特定槽分配新值时重新创建nwalls列表时,只需在列表中保留前一个值的记录,这样您就不会使用在循环中前面生成的值:

代码语言:javascript
运行
复制
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内置的内容类似:

代码语言:javascript
运行
复制
def sum(iterable):
    s = 0
    for n in iterable:
        s+=n
    return s

因此,nwalls[j] = sum(prev_nwalls[k] for k in mat[j])行将被替换为如下所示:

代码语言:javascript
运行
复制
s = 0
for k in mat[j]:
    s+=nwalls[k]
nwalls[j] = s
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38016898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档