【发布时间】:2020-11-27 03:50:07
【问题描述】:
我收到一条错误消息说 “回溯(最近一次通话最后一次): 文件“main.py”,第 10 行,在 如果列表 1[j]
我正在尝试从示例输入“10 -7 4 39 -6 12 2”中删除所有负数,以生成类似 10 4 39 12 2 的输出,并尝试使用 pop 来执行此操作。
我无法找到一个确切的解决方法,我通过谷歌搜索并在 stackoverflow 上搜索。
我不希望列表理解作为答案
input1 = str(input())
list1 = input1.split()
for i in range(len(list1)):
list1[i] = int(list1[i])
for j in range(len(list1)):
if list1[j] < 0:
list1.pop(j)
print(list1)
【问题讨论】:
-
你为什么要使用
pop?由于您没有保存该值,因此您可能应该使用del list1[index]。在任何 cse 中,在迭代列表时修改列表是 1) 正确执行令人讨厌 2) 非常低效。您应该改为创建一个新列表,无论是使用列表理解还是使用常规循环 -
我还没有学习列表理解,但我正在尝试弄清楚如何使用 for 循环来做到这一点,我过去用 pop 做过很多次,但现在用 pop 解决了我似乎无法弄清楚我只是想知道它,所以我知道该怎么做,以防我将来需要这样做,我最终将学习列表理解。我尝试了“del list1[j]”,它仍然显示相同的错误消息。
-
是否使用列表理解并不是真正的问题。困难在于在您循环的同一个列表上使用
pop(),这很少是一个好主意。如果必须使用循环,通过选择性地append()ing 到一个新列表来创建一个新列表几乎总是更好。 -
@Jamesx1080 再次,问题是没有使用列表理解。列表推导本质上是附加到列表的循环的简写。就做那个循环。但是你应该通过创建一个新列表来做到这一点。我已经写了一个答案,向您展示了如何可以这样做,但几乎从不有充分的理由这样做。所以不要。
-
如果我没有正确回答您的问题,我很抱歉,但是如果我创建一个新列表并在那里添加所有正数可以吗?