首页 > 解决方案 > 使用 while 语句迭代列表,并且 list.remove 不排除值

问题描述

我正在运行代码来清理数据库。基本上,如果某个值出现在列表中,它们应该被删除。

您可以在下面看到代码:

    pattern = re.compile("((?:\d{10}|\d{9}|\d{8}|\d{7}|\d{6}|\d{5}|\d{4})(?:-?[\d]))?(?!\S)")
    cc = pattern.findall(a)
    print("cpf:", cpf)
    print("ag:", ag)
    print("cc start:",cc)
    for i in cc:
        print("i:",i)
        try:
            while i in ag: cc.remove(i)
        except:pass
        try:
            while i in cpf:cc.remove(i)
        except:pass
        try:
            while "" in i:cc.remove(i)
        except:pass
    print("final cc:",cc)

它在我的屏幕上打印以下内容:

cpf: ['00770991092']
ag: 3527
cc start: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '00770991092', '', '', '', '', '', '', '', '', '01068651-0', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
i: 
i: 01068651-0
final cc: ['00770991092']

好吧,这些''值被删除了,这似乎工作正常。但是,由于 '00770991092' 是其中的一个值,cpf因此应该已将其删除,但事实并非如此。在“最终抄送”中,这就是我得到的值,它应该是“01068651-0”。

即使我运行此检查: if cc in cpf:print(True) 它确认它是 True。

我错过了什么?

PS.:我发现非常有趣的是,当我print(i)在 for 语句中时只显示两个值(一个是空的)。

标签: pythonpandaslistwhile-loop

解决方案


在迭代列表时修改列表效果不佳。建立一个新列表是一种选择吗?就像是:

filtered_cc = [
    i for i in cc
    if not (i in ag or i in cpf or i == "")
]

推荐阅读