我想在迭代列表时从列表中删除元素。我不认为复制列表并对其中任何一个执行操作将解决我的问题。我有一个嵌套的列表,在这里,当我得到列表==最大值的最左边或最右边的值时,我就将它附加到一个新的列表Lst1中,并从原来的列表中弹出元素,否则,从循环中中断。
lst= [[4, 3, 2, 1, 3, 5]]
lst1=[]
for i in range(len(lst)):
if lst[0][i]==max(lst[0]):
lst1.append(lst[0][i])
lst.remove(lst[0][i])
elif lst[0][maxsize_lst-1]==max(lst[0]):
lst1.append(lst[0][maxsize_lst-1])
lst.remove(lst[0][maxsize_lst-1])
else :
print("NO")
break;我得到以下错误,有时我得到索引超出范围,可能是因为我删除元素,并再次迭代列表
ValueError: list.remove(x): x not in list列表1的输出应该类似于:
5 4 3 3 2 1编辑最终列表按降序排列,但不是排序问题。在这里,我将首先选择最左边或最右边的元素,并检查它是否是== max(lst)。如果其中任何一个都是真的话,我将删除这个element.Now,我的列表将少一个元素。如果它是最左边的弹出,那么我将从索引1恢复到最后,反之亦然,如果它是正确的,我将再次执行相同的搜索,从索引0到maxsize-2,以执行相同的搜索。如果没有东西跟在最左边或最右边!= Max(lst),那就打断并打印No。
发布于 2017-07-27 17:39:28
@PRMoureu的评论是对问题所在的回答的一个很大提示。
在你的样本数据中,你的列表大小是6。你在索引上迭代,所以从0到5。当你在循环中前进的时候,你从你的列表中删除东西,然后你继续寻找它。因此,在某个时刻,你会看到一个不再存在的i,这就是为什么你会得到错误。只要使用索引,这种情况就会发生。
但你不需要名单上的索引。你需要它的价值。因此,建议是一个非常好的主意:简单地在列表本身上迭代,而不是在它的索引上迭代。这将给您这样的代码:
lst= [[4, 3, 2, 1, 3, 5]]
lst1=[]
for val in lst[0]:
print(val)
if val == max(lst[0]):
print("a")
lst1.append(val)
lst[0].remove(val)
print(lst[0])
# this shouldn't even be necessary; you should be able to sort just as well without it
elif lst[0][-1]==max(lst[0]):
print("b")
lst1.append(lst[0][-1])
lst[0].remove(lst[0][-1])
else :
print("NO")
break;注意,python不会使用像maxsize_lst这样的构造。相反,它只是使用lst来获得最后一个元素。我修正了指lst而不是lst[0]的几个地方,并通过在值之间添加逗号使lst定义实际上是有效的。
当我运行这段代码时,结果是"NO“。保留打印语句以了解原因。第一次,你有一个4,它不是最大值,所以你看最后一个值是否是最大值。是的,所以它被添加了。第二次,你有一个3,这也不是你的最大值。最后的余值也不是(其余的3),所以它说“不”并中止。您已经通过使用break语句获得了这个想法,但是您需要在它周围再循环一个循环,直到列表为空。
要使其工作,需要一个类似于以下所示的外部循环:
lst= [[4, 3, 2, 1, 3, 5]]
lst1=[]
reset = True
while len(lst[0]) != 0 and reset:
print(lst[0], lst1)
reset = False
for val in lst[0]:
print(val)
if val == max(lst[0]):
print("a")
lst1.append(val)
lst[0].remove(val)
reset = True
break
elif lst[0][-1]==max(lst[0]):
print("b")
lst1.append(lst[0][-1])
lst[0].remove(lst[0][-1])
reset = True
break
else :
print("NO")
break请注意,即使从左侧弹出,我也需要添加一个中断。否则,最终的结果是lst1的值为[5, 4, 3, 3, 2],而lst[0]中仍然包含[1]。
发布于 2017-07-27 17:18:41
有一个非常简单的解决方案:
lst = [[4, 3, 2, 1, 3, 5]]
print(sorted(lst[0], reverse=True))结果:
[5, 4, 3, 3, 2, 1]发布于 2017-07-27 17:18:04
看上去你在整理第一份名单。这可以更容易实现。排序函数将自动将其排序从最少到最大,然后您可以使用反向函数对最大到最小排序。尝试:
lst1 = reversed(sorted(lst[0]))编辑:如果您需要使用原始代码中提出的方法,我在for循环中发现了一个错误。您所取的长度为lst,而不是子列表,代码应如下所示:
for i in range(len(lst[0])):另外,我不知道您是否建立了一个变量maxsize_list,但是您可以轻松地使用lst获得列表的最后一个元素。最后,您的错误是由您试图删除lst从第一,而不是第一。这是您的代码,没有语法错误。我相信有一个symantic错误发生时,最大值是在最后。
lst= [[4,3,2,1,3,5]]
lst1=[]
for i in range(len(lst[0])):
if lst[0][i]==max(lst[0]):
lst1.append(lst[0][i])
lst[0].remove(lst[0][i])
elif lst[0][-1]==max(lst[0]):
lst1.append(lst[0][-1])
lst[0].remove(lst[0][-1])
else :
print("NO")
break;https://stackoverflow.com/questions/45357127
复制相似问题