我想在迭代列表时从列表中删除元素。我不认为复制列表并在任何一个上执行操作将解决我的问题。 我有一个嵌套列表, 这里,只要我得到list == maximum的最左边或最右边的值,我就把它附加到一个新的列表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)。如果它们中的任何一个都是真的我将删除该元素。现在我的列表将减少一个元素。如果它是最左边的弹出,那么我将从索引1恢复到最后,反之亦然如果它是最右边我将再次从索引0到maxsize-2进行相同的搜索以进行相同的搜索。如果没有像最左边或最右边那样的东西!= Max(lst)然后中断并打印否
答案 0 :(得分:4)
有一个非常简单的解决方案:
lst = [[4, 3, 2, 1, 3, 5]]
print(sorted(lst[0], reverse=True))
结果:
[5, 4, 3, 3, 2, 1]
答案 1 :(得分:1)
看起来你正在排序第一个列表。这可以更容易地实现。已排序的函数将自动从最小到最大排序,然后您可以使用反向函数从最大到最小排序。尝试:
for i in range(len(lst[0])):
编辑:如果你需要使用原始代码中提出的方法,我在你的for循环中发现了一个错误。您正在使用lst的长度,而不是子列表,代码应该是以下内容:
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;
另外,我不知道你是否建立了变量maxsize_list,但你可以使用lst [0] [ - 1]轻松获得列表的最后一个元素。最后,您尝试从lst中删除lst [0] [ - 1]而不是lst [0]导致错误。这是没有语法错误的代码。我相信当最大值结束时会发生语义错误。
R
答案 2 :(得分:1)
首先,您希望从嵌套列表中删除它们所在级别的值: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:
break
答案 3 :(得分:0)
@ PRMoureu的评论是关于出错的答案的一个重要提示。
在您的示例数据中,您的列表大小为6.您正在迭代索引,因此从0到5.当您在循环中前进时,从列表中删除内容,但随后您继续寻找它。所以在某些时候,你会看到lst [0] [i]代表一个不再存在的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 [0] [ - 1]来获取最后一个元素。我修改了您引用lst
而不是lst[0]
的几个地方,并通过在值之间添加逗号使您的lst
定义实际有效。
当我运行此代码时,我得到了#34; NO"结果是。保留打印语句以了解原因。第一次,你有一个4.它不是最大值,所以你看看最后一个值是否是最大值。它是,所以它被添加。第二次,你有三个,这也不是你的最大值。也不是最后剩下的价值(其他3),所以它说" NO"和中止。您已经通过使用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]
。