代码之家  ›  专栏  ›  技术社区  ›  zoe_tang

Python列表删除

  •  0
  • zoe_tang  · 技术社区  · 9 年前

    我的程序,我想从列表中删除一些项目:

    num_str = input('Enter a number: ')
    num_num = int(num_str)
    
    fac_list = list(range(1, num_num + 1))
    print("BEFORE: ", fac_list)
    
    for item in fac_list:
        if num_num % item == 0:
            fac_list.remove(item)
    
    print("AFTER: ",fac_list)
    

    输出:

    Enter a number: 8
    BEFORE:  [1, 2, 3, 4, 5, 6, 7, 8]
    AFTER:  [2, 3, 5, 6, 7]
    

    应该是:

    [3, 5, 6, 7]
    

    它怎么了?

    2 回复  |  直到 9 年前
        1
  •  0
  •   Anand S Kumar    9 年前

    您正在迭代 list 这是因为当您在列表上迭代时,for循环会跟踪您当前所在的索引,但当您从列表中删除某个项时,索引会发生更改,因此您可以跳过对某些元素的迭代。

    您可以创建一个新列表,其中包含您需要的值(而不是从旧列表中删除),这可以使用列表理解来完成-

    fac_list[:] = [x for x in fac_list if num_num % x != 0:]
    

    左侧的切片符号是将其置于原位,这样 fac_list 就地更改。

    如果要删除(而不是创建新列表),则应遍历其副本,例如-

    for item in fac_list[:]:
        if num_num % item == 0:
            fac_list.remove(item)
    
        2
  •  0
  •   Green Cell    9 年前

    我还没有尝试过Anand S Kumar的解决方案,但您不必生成新列表,只需向后遍历即可,因此在删除项目时,它不会影响您将要遍历的索引。

    num_str = input('Enter a number: ')
    num_num = int(num_str)
    
    fac_list = list(range(1, num_num + 1))
    print("BEFORE: ", fac_list)
    
    for i in range(len(fac_list)-1, -1, -1): # Iterate backwards instead
        item = fac_list[i]
        if num_num % item == 0:
            fac_list.remove(item)
    
    print("AFTER: ",fac_list)
    

    输出:

    ('后:',[3,5,6,7])