【问题标题】:Removing dynamically an element from a list从列表中动态删除元素
【发布时间】:2021-08-02 02:01:28
【问题描述】:

我的问题看起来有点奇怪和简单,但我找不到令人满意的答案。我想迭代一个列表,并从中删除元素。当删除后列表中只剩下一个元素时,就会出现问题:循环不会迭代最后一个元素,就像列表为空一样。

我正在使用 for .. in ..,如下例所示:

def test_remove(self):
    """Test to remove all values from a list."""
    test = [4, 5]
    [test.remove(i) for i in test]
    print test

我得到以下输出:

[5]

这是否意味着像我在列表上所做的迭代不会在删除元素时动态调整列表的大小(使用 for i in range() 也会发生同样的事情)?或者只是因为我只是到达i = len,所以我不能更进一步?

我总是可以作弊并检查 len 何时等于 1,但我想了解是否有更漂亮的方法来做到这一点。

非常感谢。

【问题讨论】:

    标签: python list


    【解决方案1】:

    问题在于,当您从列表中删除项目时,其他项目会更改其中的位置,导致在循环不断迭代时跳过其中一些项目。尝试使用更多元素,您将看到跳过如何遵循模式。

    为避免这种情况,您需要以不同的方式迭代列表,并且在我看来是向后迭代。

    一种方法可以是:

        i = len(test)-1
        while (i>=0):
            del test[i]
            i-=1
        print(test)
    

    【讨论】:

    • 是的,我终于做到了。我认为 for in 能够避免这种循环结构。谢谢:)
    【解决方案2】:

    虽然您不能在对可迭代对象进行修改时执行 for in 循环或列表推导。最简单的就是使用while循环

    while len(test):
        test.pop()
    

    【讨论】:

    • 感谢您的回答。但是在我的情况下,我不能使用 .pop() 来从列表中删除一个项目,因为我必须从列表的开头开始,并且在我迭代它时可能会或可能不会删除该项目。这取决于一些条件。我想我现在会做一个简单的长度检查。
    【解决方案3】:

    它不仅仅是最后一个元素,它是每一个奇怪的元素 - 在更长的列表中测试它。这是因为当您删除元素时,所有其他元素都会移动位置。最好的解决方法可能是将您不想想要删除的元素复制到新列表中。

    【讨论】:

      【解决方案4】:

      您可以使用以下代码:

      while len(test):
         if condition_to_remove is True: 
              test.pop()
      

      以下问题有一些很好的答案可能会对您有所帮助:

      Remove items from a list while iterating

      【讨论】:

        【解决方案5】:

        作为您的描述,您也可以通过这种方式。

        ls = [1,2,3,4]
        ls_length = len(ls)
        i = 0  
        condition_satisfied = True
        while ls_length:
            if i<ls_length:
                test_num = ls[i]
                i = i + 1
                if condition_satisfied:
                    ls.remove(test_num)
                    ls_length = len(ls)
                    i = 0
        print(ls)
        

        【讨论】:

          【解决方案6】:

          用途:

          for (Iterator<String> iter = list.listIterator(); iter.hasNext(); ){ 
              String a = iter.next();  
              if (...) {            
                  iter.remove();  
                  }    
              }
          

          使用上面的代码;它会起作用的。它对我有用,可以从列表中删除所有元素。

          【讨论】:

            【解决方案7】:

            轻松使用元素的索引:

            for index in range(0,len(my_list)):
                item = my_list[index]
                if item == item_to_remove:
                    my_list.remove(item_to_remove)
                    index -= 1
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-22
              • 1970-01-01
              • 2017-03-05
              相关资源
              最近更新 更多