首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中迭代时删除列表,而不复制到新列表

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

Stack Overflow用户
提问于 2017-07-27 17:13:21
回答 4查看 117关注 0票数 0

我想在迭代列表时从列表中删除元素。我不认为复制列表并对其中任何一个执行操作将解决我的问题。我有一个嵌套的列表,在这里,当我得到列表==最大值的最左边或最右边的值时,我就将它附加到一个新的列表Lst1中,并从原来的列表中弹出元素,否则,从循环中中断。

代码语言:javascript
复制
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;

我得到以下错误,有时我得到索引超出范围,可能是因为我删除元素,并再次迭代列表

代码语言:javascript
复制
ValueError: list.remove(x): x not in list

列表1的输出应该类似于:

代码语言:javascript
复制
5 4 3 3 2 1

编辑最终列表按降序排列,但不是排序问题。在这里,我将首先选择最左边或最右边的元素,并检查它是否是== max(lst)。如果其中任何一个都是真的话,我将删除这个element.Now,我的列表将少一个元素。如果它是最左边的弹出,那么我将从索引1恢复到最后,反之亦然,如果它是正确的,我将再次执行相同的搜索,从索引0到maxsize-2,以执行相同的搜索。如果没有东西跟在最左边或最右边!= Max(lst),那就打断并打印No。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-27 17:39:28

@PRMoureu的评论是对问题所在的回答的一个很大提示。

在你的样本数据中,你的列表大小是6。你在索引上迭代,所以从0到5。当你在循环中前进的时候,你从你的列表中删除东西,然后你继续寻找它。因此,在某个时刻,你会看到一个不再存在的i,这就是为什么你会得到错误。只要使用索引,这种情况就会发生。

但你不需要名单上的索引。你需要它的价值。因此,建议是一个非常好的主意:简单地在列表本身上迭代,而不是在它的索引上迭代。这将给您这样的代码:

代码语言:javascript
复制
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语句获得了这个想法,但是您需要在它周围再循环一个循环,直到列表为空。

要使其工作,需要一个类似于以下所示的外部循环:

代码语言:javascript
复制
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]

票数 0
EN

Stack Overflow用户

发布于 2017-07-27 17:18:41

有一个非常简单的解决方案:

代码语言:javascript
复制
lst = [[4, 3, 2, 1, 3, 5]]
print(sorted(lst[0], reverse=True))

结果:

代码语言:javascript
复制
[5, 4, 3, 3, 2, 1]
票数 4
EN

Stack Overflow用户

发布于 2017-07-27 17:18:04

看上去你在整理第一份名单。这可以更容易实现。排序函数将自动将其排序从最少到最大,然后您可以使用反向函数对最大到最小排序。尝试:

代码语言:javascript
复制
lst1 = reversed(sorted(lst[0]))

编辑:如果您需要使用原始代码中提出的方法,我在for循环中发现了一个错误。您所取的长度为lst,而不是子列表,代码应如下所示:

代码语言:javascript
复制
for i in range(len(lst[0])):

另外,我不知道您是否建立了一个变量maxsize_list,但是您可以轻松地使用lst获得列表的最后一个元素。最后,您的错误是由您试图删除lst从第一,而不是第一。这是您的代码,没有语法错误。我相信有一个symantic错误发生时,最大值是在最后。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45357127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档