python - 使用 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 语句中时只显示两个值(一个是空的)。
解决方案
在迭代列表时修改列表效果不佳。建立一个新列表是一种选择吗?就像是:
filtered_cc = [
i for i in cc
if not (i in ag or i in cpf or i == "")
]
推荐阅读
- axios - Nuxt 使用 JSON 服务器生成静态网站
- docker - Docker 不强制执行 apparmor 配置文件
- python - tf-idf sickitlearn 将“单词”与单词分开
- azure - Azure 订阅事件未能创建资源组“未定义”
- google-cloud-platform - 为什么 RDP 选项在 Windows VM 的 GCP 控制台中不可见?
- string - 通过使用折叠函数在它们之间放置分隔符将列表中的字符串连接成单个字符串(无递归)
- json - jq使用相同对象的值进行比较
- javascript - 淘汰赛组件更新可观察的父模型,但随后又恢复到旧值
- node.js - 未满足的依赖nodejs 8
- c# - 序列化为 JSON 时可以使用 c# 方法吗