我想使用列表理解来修改列表。像这样的东西:
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]]
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]
您正试图在列表推导之外使用循环变量
jj
,但它没有被定义。我还没有完全理解列表理解试图做什么,但对于初学者来说这是你的问题。 jj
仅在该括号内定义,但不在等号的另一侧,您分配给 c 的索引。
重复这里多次提到的内容,但添加了一些信息:
c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]
这个列表推导式赋值语句会抛出错误,因为左侧(要赋值的目标)试图获取一个不存在的项。你已经写了一个索引的索引,这是合法的,但是解释器正在搜索一些尚未定义的
jj
引用的索引。
与字典对象不同,在字典对象中,键可以在分配时创建,当索引在边界内(即要分配的位置已经存在)或被已定义的名称引用时,列表的索引分配成功执行。
jj
适合在列表理解表达式中使用。列表理解的语法允许在表达式中定义一个新变量作为可迭代 range(len(a))
的目标。但是因为解释器从左到右评估整个赋值语句,所以 jj
在列表理解表达式之前不存在。
最后,除了语法错误之外,您的代码逻辑不会产生您预期的结果。请编辑您的帖子以准确反映您要执行的操作。
编辑:下面的评论已经解决了这里要做的一些编辑。
c[:len(a)]=[x for x in [c[a[jj]]+c[b[jj]] for jj in range(len(a))]]
由于列表理解是为了创建一个新列表,我怀疑它是否有能力修改括号内的项目。上面的代码是我能想到的最接近列表理解的东西。但是花哨的代码并不能真正让它看起来更聪明,所以只要再写一行,并使用一个循环。