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}
那答案中的remove为什么没有向前移动
对于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]`。
问题说的有点乱,我重新梳理了下: 如果将答案里面的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),求大佬告知为这是为什么