【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’被跳过了。
在这里插入图片描述
  于是我们可以这样理解:当编译器执行完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'])

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值