【问题标题】:How to remove an item while iterating over a list?遍历列表时如何删除项目?
【发布时间】:2018-06-27 20:59:24
【问题描述】:

我的代码如下所示:

def nue(li):
    for i in li:
        li.remove(i)
    print(li)

li = [1, 2, 3]

nue(li)

但是,运行它会导致:

>>> [2]

更一般地说,如何在迭代列表时删除列表中的第 i 个位置(由于它在嵌套循环中的某些测试失败或类似的原因)?

【问题讨论】:

  • 不要。建立一个新列表。
  • 如果你想清空列表,为什么不直接使用li=[]
  • 从您正在迭代的列表中删除项目就像锯掉您正坐在的树枝。如果你不是很小心,坏事就会发生。建立一个新列表通常更简单、更快。
  • @rnso 这就像用核武器来消灭蜘蛛
  • [1, 2, 3, 4, 5, 6, 7] 上尝试删除循环。您应该能够看到模式。

标签: python python-3.x list for-loop


【解决方案1】:

您可能需要考虑反向遍历数组。下面的代码演示了三个做同样事情的函数。所有这些都称为prune 并且可以互换。通过以相反的顺序查看数组,可以避免更改将来要检查的值的索引。

#! /usr/bin/env python3
def main():
    array = list(range(20))
    print(array)
    prune(array, lambda value: value % 3)
    print(array)


def prune(array, del_condition):
    for index, value in reversed(tuple(enumerate(array))):
        if del_condition(value):
            del array[index]


def prune(array, del_condition):
    for index in range(len(array) - 1, -1, -1):
        value = array[index]
        if del_condition(value):
            del array[index]


def prune(array, del_condition):
    for index in reversed(range(len(array))):
        if del_condition(array[index]):
            del array[index]


if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    你可以这样做

    def nue(li):
        for i in li[:]:
            li.remove(i)
        print(li)
    
    li = [1, 2, 3]
    
    nue(li)
    

    li[:] 会克隆原来的li

    【讨论】:

      【解决方案3】:

      为什么不直接使用列表推导而不是从现有列表中删除项目?

      old_list = [1,2,3,4,5]
      li = [1,2,3]
      new_list = [i for i in old_list if i not in li]
      

      如果你不想使用列表推导,你可以试试过滤功能

      old_list = [1,2,3,4,5]
      li = [1,2,3]
      new_list = list(filter(lambda x: x not in li, old_list))
      

      【讨论】:

        【解决方案4】:

        尝试列表理解:

        def remi(slist, i):    # remi means REMove I
            return [slist[j] 
                    for j in range(len(slist))
                    if j != i]
        
        print(remi ([1,2,3,4], 2))
        

        输出:

        [1, 2, 4]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          • 2013-10-15
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多