在python中迭代时删除列表而不复制到新列表

时间:2017-07-27 17:13:22

标签: python list

我想在迭代列表时从列表中删除元素。我不认为复制列表并在任何一个上执行操作将解决我的问题。 我有一个嵌套列表, 这里,只要我得到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)然后中断并打印否

4 个答案:

答案 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]。但即便如此,如果您的目标是将列表中的所有值排序,您的代码也无法执行此操作:在您的示例的第一步中,

  1. 如果i = 0,则从列表中删除5(最后一项,最大值)
  2. 下一步,i = 1,你永远不会再次访问i = 0的值 但是,也许这对你来说不是问题,你不清楚你想用你的代码实现什么......
  3. 编辑:我重新阅读了您的问题,如果你想要的是从旧列表到新列表的最大值时实际上弹出左/右值,那么你应该'使用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]