Python中列表与for循环之间的冲突

在使用python对列表进行批量处理的时候,往往需要遍历,这个时候很多初学者的选择往往是for循环遍历,但是在实际使用中却往往不会有想要的效果。
以以下代码为例,对未确认的用户列表批量操作,使其中未确认的用户成为已确认的用户:

unconfirmed_users=['alice','brian','candace']
confirmed_users=[]
for unconfirmed_user in unconfirmed_users:
    print("unconfirmed_user:%s\n"%unconfirmed_user)
    confirmed_users.append(unconfirmed_user)
    unconfirmed_users.remove(unconfirmed_user)
print(confirmed_users)

结果打印出的结果为:

unconfirmed_user:alice
unconfirmed_user:candace
[‘alice’, ‘candace’]

我们注意到漏掉了一个元素’brian’,为什么呢?因为我们在使用for循环的时候对列表进行了改动,造成了索引映射的变化。我们不妨在unconfirmed_users列表中再增加两项,结果在confirmed_users中只出现了三项。不难发现:
在第一个unconfirmed_user被选中,从原列表到confirmed_users表的时候,在原列表的索引映射中,原本对应索引[0]的元素现在对应的是索引[1],执行多次,我们也就会多次移动元素的索引,可以得知原列表如果有n个元素,那么用这样的放法在得到的列表中只能得到:
1.(n/2)的元素——n为偶数;
2.(n+1)/2的元素——n为奇数;
因此会有元素的遗漏。

对此,如果要处理类似的问题,可以使用while循环:
以改情景为例,示例代码如下:

unconfirmed_users=['alice','brian','candace']
confirmed_users=[]
while unconfirmed_users:
	current_user = unconfirmed_users.pop()
	print('Verifying user:'+current_user.title())
	confirmed_users.append(current_user)
print('confirmed_users:\n')
for confirmed_user in confirmed_users:
	print(confirmed_user.title())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值