一开始理解成L和S都有的数字,就从L中删除,把剩下的数字传给S,即L→L(2,4,6,8,10, S={1,2,3,4,5,6,7,8,9,10,11},就写了下面的代码,为什么用debug调试 ,num的数值只经过1,3,5,7,9,没有2,4,6,8?

来源:8-4 Python删除set元素

慕UI7540685

2020-10-07 11:44

L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
S = set([1, 3, 5, 7, 9, 11])

for num in L:
    if num in S:
        L.remove(num)
    else:
        S.add(num)

print(L)    # L=[2, 4, 6, 8, 10]
print(S)    # S ={1, 3, 5, 7, 9, 11}


写回答 关注

3回答

  • 慕UI7540685
    2020-10-14 02:40:54

    那答案中的remove为什么没有向前移动

  • 慕工程2432310
    2020-10-14 00:12:49

    对于python中的remove()函数,官方文档的解释是:Remove first occurrence of value.大意也就是移除列表中等于指定值的第一个匹配的元素。
    常见用法: a = [1,2,3,4],a.remove(1),然后a就是[2,3,4];对于a = [1,1,1,2],其结果也是[1,1,2],这是最基本的用法。
    但是对于下面这个:

    a = [1,2,3,4]
    for i in a:
          a.remove(i)# 结果a = [2,4]

    或者说

    a = [1,1,1,1,1,2]
    for i in a:
          a.remove(1)#结果a = [1,1,2]
    是不是跟想象中的不一样,其主要原因如下(^表示当前迭代器位于列表中的位置):
       a = [ 1 , 2 , 3 , 4]
    假设此时  ^
    默认情况下只想第一个元素,然后执行a.remove(1),然后下标向后移动,列表因为删除了元素,后面的向前移动,如下:
       a = [ 2 , 3 , 4]
       此时       ^
    此时执行a.remove(3),重复上面的移动
       a = [ 2 , 4]
       此时           ^
    因为已经到了列表的边界,故结束遍历,并返回`a = [2,4]`。


    慕UI754...

    懂了,多谢

    2020-10-14 02:54:08

    共 2 条回复 >

  • 慕UI7540685
    2020-10-09 05:00:37

    问题说的有点乱,我重新梳理了下: 如果将答案里面的if i in S:S.remove(i),改成 if i in S: L.remove(i),得到如下代码:

    L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]                           
    S = set([1, 3, 5, 7, 9, 11])
    for i in L:
        if i in S:
            L.remove(i) 
        else:
            S.add(i)
    print(S)        
    
    通过pycharm的debug发现,这时候的for i in L 里的i=(1,3,5,7,9),而不像答案的i =(1,2,3,4,5,6,7,8,9,10),求大佬告知为这是为什么




Python3 入门教程(新版)

python3入门教程,让你快速入门并能编写简单的Python程序

154174 学习 · 1075 问题

查看课程

相似问题