用列表理解修改列表

时间:2020-04-24 19:24:51

标签: python list list-comprehension

我想使用列表理解来修改列表。像这样:

c = [10,20,30,40,50,60,70,80,90]
a = [0,1,2]
b = [3,4,5]

c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]

我的预期输出:

c = [50,70,90,40,50,60,70,80,90]

但是每次出现错误:

    c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]
NameError: name 'jj' is not defined

我在做什么错了?

编辑: 我试图在不使用for循环的情况下向下复制该语句:

for jj in range(len(a)):
    c[a[jj]] = c[a[jj]] + c[b[jj]]

3 个答案:

答案 0 :(得分:1)

jj未在左侧定义。即使是这样,作业也不会做您想要的。您需要一个常规的for循环:

for jj in range(len(a)):
    c[a[jj]] = c[a[jj]] + c[b[jj]]

不过,您可以使用enumerate和添加分配(+=)使其更整洁:

for jj, x in enumerate(a):
    c[x] += c[b[jj]]

或者最好使用zip

for x, y in zip(a, b):
    c[x] += c[y]

答案 1 :(得分:0)

您正在尝试在列表理解之外使用循环变量jj(未定义)。我还没有完全理解列表理解的意图,但是对于初学者来说,这是您的问题。 jj仅在该方括号内定义,而在等号的另一侧(要分配给索引c的地方)没有定义。

答案 2 :(得分:0)

多次重复这里所说的内容,但添加了一些附加信息:

c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]

此列表理解分配语句引发错误,因为左侧(要分配的目标)试图获取不存在的项目。您已经编写了合法的索引索引,但是解释器正在搜索尚未定义的某些jj所引用的索引。

与字典对象不同,在字典对象中可以在分配键时创建键,当索引在范围内(即要分配的位置已经存在)或已由名称引用时,可以成功执行列表的索引分配定义。

jj可以在列表理解表达式中使用。列表理解的语法允许在表达式中定义一个新变量作为可迭代range(len(a))的目标。但是因为解释器从左到右评估整个赋值语句,所以jj直到列表理解表达式才存在。

最后,除了语法错误外,代码的逻辑不会导致预期的结果。请修改您的帖子,以准确反映您要执行的操作。

编辑:在此处进行的编辑很少,下面的评论对此做了解决。