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

一. 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'被跳过了。
image.png

  于是我们可以这样理解:当编译器执行完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'])

你可能感兴趣的:(【Python】list列表和set列表之间的相互删除和补充)