使用列表理解修改列表

问题描述 投票:0回答:4

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

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]]
python list list-comprehension
4个回答
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]

0
投票

您正试图在列表推导之外使用循环变量

jj
,但它没有被定义。我还没有完全理解列表理解试图做什么,但对于初学者来说这是你的问题。
jj
仅在该括号内定义,但不在等号的另一侧,您分配给 c 的索引。


0
投票

重复这里多次提到的内容,但添加了一些信息:

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

这个列表推导式赋值语句会抛出错误,因为左侧(要赋值的目标)试图获取一个不存在的项。你已经写了一个索引的索引,这是合法的,但是解释器正在搜索一些尚未定义的

jj
引用的索引。

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

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

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

编辑:下面的评论已经解决了这里要做的一些编辑。


0
投票
c[:len(a)]=[x for x in [c[a[jj]]+c[b[jj]] for jj in range(len(a))]]

由于列表理解是为了创建一个新列表,我怀疑它是否有能力修改括号内的项目。上面的代码是我能想到的最接近列表理解的东西。但是花哨的代码并不能真正让它看起来更聪明,所以只要再写一行,并使用一个循环。

© www.soinside.com 2019 - 2024. All rights reserved.