一. list列表中的元素跟set列表中有相同的,把list列表中的相应元素删掉
解决方法
首先,采用如下代码,输出为['Lisa', 'Bart'];
s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
x=-1
for m in L:
x+=1
if m in s:
L.pop(x)
print L
尝试改进代码后,输出为['Lisa', 'Paul'];
s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
x=-1
for m in L:
x+=1
if m in s:
L.pop(x)
x-=1
print L
很奇怪'Adam'删掉了,'Lisa'并没有被删掉,于是增加set和list的元素之后再做尝试,输出结果为['Lisa', 'cyc', 'Paul'];
s = set(['Adam', 'Lisa', 'Paul' ,'cyc'])
L = ['Adam', 'Lisa', 'Bart', 'cyc', 'Paul']
x=-1
for m in L:
x+=1
if m in s:
L.pop(x)
x-=1
print L
于是发现规律:当list列表中的一个元素被删掉,那么紧接着这个被删掉的元素的后面的元素('Lisa'和'cyc')就不会被删掉,不管'Lisa'和'cyc'有没有跟set里的元素重复。所以看上去就好像'Lisa'和'cyc'被跳过了。
于是我们可以这样理解:当编译器执行完L.pop(0)时,原来的L[0]被删除了,后面的元素全部左移一位('Lisa'变为L[0],'Bart'变为L[1]),然后编译器回到for m in L:
,这时的m指的是L[1],那么L[0]的'Lisa'就被跳过了,同理'cyc'也是。所以最好创建一个L的副本LL,只改动LL的内容,L不变,如下:
s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
LL = ['Adam', 'Lisa', 'Bart', 'Paul']
x=-1
for m in L:
x+=1
if m in s:
LL.pop(x)
x-=1
L=LL
print L
结果输出['Bart']
。
二. list列表中的元素跟set列表中有相同的,则把set列表中的相应元素删掉;list中的有而set中没有的元素,则添加到set中
解决方法
s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for n in L:
if n in s:
s.remove(n)
else:
s.add(n)
print s
输出结果为set(['Bart'])
。