从列表中动态删除元素

时间:2017-06-05 07:45:49

标签: python list

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

我正在使用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]

这是否意味着像我在列表上进行的迭代不会在删除元素时动态调整列表大小(同样的事情是在range()中使用i)?或者只是因为我只是到达i = len,所以我不能再往前走了?

我总是可以欺骗并检查len等于1但我想知道是否有更美妙的方法来做到这一点。

非常感谢。

7 个答案:

答案 0 :(得分:2)

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

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

可以采取以下措施:

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

答案 1 :(得分:1)

虽然在修改该迭代时无法执行for循环或列表理解。最简单的是使用while循环

while len(test):
    test.pop()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用以下代码:

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

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

Remove items from a list while iterating

答案 4 :(得分:0)

根据您的描述,您也可以通过这种方式。

Command="{Binding Path=DataContext.MyClickRowEventCommand,       
   RelativeSource= {RelativeSource FindAncestor,
   AncestorType={x:Type DataGrid}}}"
   CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"

答案 5 :(得分:0)

使用:

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

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

答案 6 :(得分:0)

轻松使用元素的索引:

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