鱼C论坛

 找回密码
 立即注册
查看: 2053|回复: 4

[已解决]大家进来一看,删除列表元素的问题

[复制链接]
发表于 2017-10-9 10:35:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import string
import random
l=[]
a = string.ascii_uppercase
b = string.digits
for i in range(len(a)):
        l.append(a[i])
for i in range(len(b)):
        l.append(b[i])
for i in l:
        if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
                l.remove(i)
j=random.sample(l, 12)
q=''.join(j)

print(q)

for i in l:
        if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
                l.remove(i)
这一句为什么不能去除列表中的 '0'和'2'。
最佳答案
2017-10-9 11:25:57
本帖最后由 醉酒青牛 于 2017-10-9 11:27 编辑

出现这种问题,主要是for循环语句遍历列表元素出现的问题。因为列表本身是在删除元素,一直在更新为新的列表的。导致for循环语句中的遍历语句会跳过删除一个元素之后的下一个元素,如果碰巧下一个元素也是要删除的元素,就出现了问题。说起来比较拗口,我们举实例来说明:
>>> k = [1,1,3,5]        新建一个列表,包含元素1,1,3,5四个元素;
>>> for each in k:      each去遍历列表k中的元素
        if each == 1:      判定元素值为1时删除该元素
                k.remove(each)
本来列表k中第一个元素为1,第二个元素为1,第三个元素为3,第四个元素为5
当判定到第一个元素时,k列表中把第一个元素删除,此时k列表变为第一个元素为1,第二个元素为3,第三个元素为5,回到for循环内,each要取出k列表中的第二个元素3,此时就把原本为k列表的第二个元素的1给漏过去了,导致出现没有删除掉指定元素。
>>> k    #显示k的值,发现原本的第二个元素1没有被删除
[1, 3, 5]
               
>>> k
[1, 3, 5]
>>>
为了避免出现这种问题,我们引入一个新列表,专门存储不包含指定元素的列表内其他元素,则不会出现此问题,代码如下:
import string
import random
l=[]
a = string.ascii_uppercase
b = string.digits
for i in range(len(a)):
        l.append(a[i])
for i in range(len(b)):
        l.append(b[i])
l1 = []  #存放去除指定元素之后的l的列表元素
for i in l:
        if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
                continue
        else:
            l1.append(i)
j=random.sample(l, 12)
q=''.join(j)

print(q)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-9 10:57:43 | 显示全部楼层
从后往前删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-9 11:25:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 醉酒青牛 于 2017-10-9 11:27 编辑

出现这种问题,主要是for循环语句遍历列表元素出现的问题。因为列表本身是在删除元素,一直在更新为新的列表的。导致for循环语句中的遍历语句会跳过删除一个元素之后的下一个元素,如果碰巧下一个元素也是要删除的元素,就出现了问题。说起来比较拗口,我们举实例来说明:
>>> k = [1,1,3,5]        新建一个列表,包含元素1,1,3,5四个元素;
>>> for each in k:      each去遍历列表k中的元素
        if each == 1:      判定元素值为1时删除该元素
                k.remove(each)
本来列表k中第一个元素为1,第二个元素为1,第三个元素为3,第四个元素为5
当判定到第一个元素时,k列表中把第一个元素删除,此时k列表变为第一个元素为1,第二个元素为3,第三个元素为5,回到for循环内,each要取出k列表中的第二个元素3,此时就把原本为k列表的第二个元素的1给漏过去了,导致出现没有删除掉指定元素。
>>> k    #显示k的值,发现原本的第二个元素1没有被删除
[1, 3, 5]
               
>>> k
[1, 3, 5]
>>>
为了避免出现这种问题,我们引入一个新列表,专门存储不包含指定元素的列表内其他元素,则不会出现此问题,代码如下:
import string
import random
l=[]
a = string.ascii_uppercase
b = string.digits
for i in range(len(a)):
        l.append(a[i])
for i in range(len(b)):
        l.append(b[i])
l1 = []  #存放去除指定元素之后的l的列表元素
for i in l:
        if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
                continue
        else:
            l1.append(i)
j=random.sample(l, 12)
q=''.join(j)

print(q)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-9 11:30:52 | 显示全部楼层
用remove删除列表中的元素时,我推荐如下写法
你上面之所以出现问题是因为,remove方法是直接从内存中删除列表中的元素
比如L=[1,2,3,4]
for i in L:
        if i in '23':
                L.remove(i)
当你for循环删除了2时,此时3自动移动到2的位置,指针仍然自动加1,那么下一个比较的元素就是4了,所以自动跳过了3的检测
也就是说这个for循环,第一轮i=1,第二轮i=2,第三轮i=4
import string
import random
l=[]
a = string.ascii_uppercase
b = string.digits
for i in range(len(a)):
        l.append(a[i])
for i in range(len(b)):
        l.append(b[i])
new_L=[]
for i in l:
    if i not in "0125OSIZ":
        new_L.append(i)
print("".join(new_L))
j=random.sample(new_L, 12)
q=''.join(j)
print(q)
ABCDEFGHJKLMNPQRTUVWXY346789
4XGYURQHPTLA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-9 13:58:09 | 显示全部楼层
Teagle 发表于 2017-10-9 11:30
用remove删除列表中的元素时,我推荐如下写法
你上面之所以出现问题是因为,remove方法是直接从内存中删除 ...

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表