关于列表循环删除自身元素的问题

关于列表循环删除自身元素的问题

不能在循环自身的时候删除自身元素!!!

例:我想要删除a与start和end中共有的元素

a = ['2021-07-01', '2021-07-02', '2021-07-03', '2021-07-04', '2021-07-05',
 '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-10',
  '2021-07-11', '2021-07-12', '2021-07-13', '2021-07-14', '2021-07-15',
   '2021-07-16', '2021-07-17', '2021-07-18']

start = ['2021-06-28', '2021-06-29', '2021-06-30', '2021-07-01', '2021-07-02', 
'2021-07-03', '2021-07-04']

end = ['2021-07-12', '2021-07-13', '2021-07-14', '2021-07-15', '2021-07-16', 
'2021-07-17', '2021-07-18']

错误:自身循环删除自身元素

for i in a:
    if i in start or i in end:
        a.remove(i)

print(a)
#
['2021-07-02', '2021-07-04', '2021-07-05', '2021-07-06', '2021-07-07',
 '2021-07-08', '2021-07-09', '2021-07-10', '2021-07-11', '2021-07-13', 
 '2021-07-15', '2021-07-17']

可以看到,删除的元素乱七八糟,没有实现想要的效果

错误原因:

因为列表的元素在内存中是一段连续的物理地址,如果删除后,地址就会往前移。导致地址删除的元素对象发生变化。而在自身循环中,获取的自身元素信息是在删除之前,导致删除后并没有及时获取自身元素对应的新内存,从上面错误结果可以看见,其实是删除一个然后跳过了一个。所以删除不要在自身循环中去删除

print('列表地址:',id(a))

id_list = [id(i) for i in a]
print(id_list)
print()
for i in a:
    if i in start or i in end:
        a.remove(i)
        new_id_list = [id(i) for i in a]
        print(new_id_list)




列表地址: 2036980998728
[2036981497328, 2036985102896, 2036985073008, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144496, 2036985144560, 2036985144624, 2036985144688, 2036985144752, 2036985144816, 2036985144880]

[2036985102896, 2036985073008, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144496, 2036985144560, 2036985144624, 2036985144688, 2036985144752, 2036985144816, 2036985144880]
[2036985102896, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144496, 2036985144560, 2036985144624, 2036985144688, 2036985144752, 2036985144816, 2036985144880]
[2036985102896, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144560, 2036985144624, 2036985144688, 2036985144752, 2036985144816, 2036985144880]
[2036985102896, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144560, 2036985144688, 2036985144752, 2036985144816, 2036985144880]
[2036985102896, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144560, 2036985144688, 2036985144816, 2036985144880]
[2036985102896, 2036985070192, 2036985072304, 2036985072496, 2036985072816, 2036985072944, 2036985070320, 2036985144368, 2036985144432, 2036985144560, 2036985144688, 2036985144816]

正确:别处循环删除某列表元素

因为从别的循环中去删除列表元素,每次循环都是重新读取该列表新的元素内存地址,所有可以放心删除。

for i in start:
    if i in a:
        a.remove(i)
        
for o in end:
    if o in a:
        a.remove(o)
        
print(a)
#['2021-07-05', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09',
# '2021-07-10', '2021-07-11']

当然也可以用set

但是set不能把保证还是原来的顺序,需要根据情况来使用

r = set(a) -set(start) -set(end)
print(sorted(list(r)))
#['2021-07-05', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09',
# '2021-07-10', '2021-07-11']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值