我想在迭代列表时从列表中删除元素。我不认为复制列表并对其中任何一个执行操作将解决我的问题。我有一个嵌套的列表,在这里,当我得到列表==最大值的最左边或最右边的值时,我就将它附加到一个新的列表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:28:41
首先,您希望从嵌套列表中删除其所在级别的值:lst.remove(x)只在lst中搜索,而不是在lst中搜索,以及嵌套在lst中的所有可能列表。这将解决ValueError的问题。
其次,只需手工运行示例就可以告诉您为什么它不能工作:您永远不会更新maxsize_lst,因此,一旦弹出一个项,该值就不再有效。一个简单的解决方案是使用python的负索引系统访问列表的最后一个值:lst[-1]。但即便如此,如果您的目标是将列表中的所有值排序,则您的代码无法做到这一点:在示例的第一步,
编辑:,我重读了您的问题,如果您想要的实际上是从旧列表到新列表的最大值时弹出左/右值,那么您不应该使用for循环迭代列表,而应该使用这样的while循环:
size_lst = len(lst[0])
while size_lst > 0:
if lst[0][0] == max(lst[0]):
# Leftmost element max of the list
lst1.append(lst[0].pop(0) # Pop leftmost element of lst[0] into lst1
size_lst -= 1 # Record that you decreased the size of your list
elif lst[0][-1] == max(lst[0]):
# Same with the rightmost element
lst1.append(lst[0].pop(-1)
size_lst -= 1
else:
breakhttps://stackoverflow.com/questions/45357127
复制相似问题