【Python】list列表和set列表之间的相互删除和补充

First

  list列表中的元素跟set列表中有相同的,把list列表中的相应元素删掉。

解决方法

  首先,采用如下代码,输出为[‘Lisa’, ‘Bart’]。

1
2
3
4
5
6
7
8
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’];

1
2
3
4
5
6
7
8
9
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’]。

1
2
3
4
5
6
7
8
9
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不变,如下:

1
2
3
4
5
6
7
8
9
10
11
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']

Second

  list列表中的元素跟set列表中有相同的,则把set列表中的相应元素删掉;list中的有而set中没有的元素,则添加到set中。

解决方法
1
2
3
4
5
6
7
8
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'])

————————— 本文结束 感谢您的阅读 —————————
谢谢你请我喝咖啡ლↂ‿‿ↂლ(支付宝扫一扫即可领红包, 消费时可抵现! 你省钱, 我赚钱, 多谢支持~)