gpt4 book ai didi

python - 在有效性检查后从 python 列表中删除项目

转载 作者:行者123 更新时间:2023-11-30 22:55:28 26 4
gpt4 key购买 nike

背景:

我正在编写一个小脚本,它需要文件中的电子邮件地址列表作为其参数之一。该脚本将继续通过 telnet 连接使用电子邮件地址到 SMTP 服务器,因此它们需要在语法上有效;因此我添加了一个函数来检查电子邮件地址的有效性(顺便说一句,这个正则表达式可能并不完美,但这不是问题的重点,请耐心等待。可能会放松):

def checkmailsyntax(email):
match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', email)

if match == None:
return True

main() 程序继续读取输入文件名作为参数(在 argparse 中)并将其插入到(当前全局)列表中:

with open(args.targetfile) as targets:
target_email_list = targets.readlines()

我认为如果 checkmailsyntax ,脚本能够自动从列表中删除电子邮件地址(而不是仅仅告诉您这是错误的,这就是它过去所做的),这会很棒。功能失败。然后,这个清理过的列表可以继续向 SMTP 服务器提交语法上有效的电子邮件地址:

for i in target_email_list:
if checkmailsyntax(i):
target_email_list.remove(i)

错误检查我在删除元素片段之前和之后放入的代码,以查看它是否正在完成其工作:

for i in target_email_list:
print i

问题:代码的输出是:

删除元素片段之前(以及提交的文件的全部内容):

me@example.com  
you@example.com
them@example.com
noemail.com
incorrectemail.com
new@example.com
pretendemail.com
wrongemail.com
right@example.com
badlywrong.com
whollycorrect@example.com

删除元素片段后:

me@example.com  
you@example.com
them@example.com
incorrectemail.com
new@example.com
wrongemail.com
right@example.com
whollycorrect@example.com

所以我很困惑为什么 'noemail.com' , 'pretendemail.com''badlywrong.com'已被删除,但'incorrectemail.com''wrongemail.com'不是。当文件中连续存在两封语法不正确的电子邮件时,似乎会发生这种情况。

有人能指出我正确的方向吗?

最佳答案

这是因为您在迭代列表时从列表中删除元素:

for i in target_email_list:
if checkmailsyntax(i):
target_email_list.remove(i) # here

因为,以下值在一起:

pretendemail.com  
wrongemail.com

一旦删除 pretendemail.com 电子邮件,下一个 wrongemail.com 就会向上移动,并且迭代器认为这已经被迭代了。因此,接下来的项目是 right@example.com ,并且 wrongemail.com 永远不会检查语法是否有效。您可以在检查语法之前添加 print(i) 并亲自查看。

您可以使用列表理解来实现此目的:

valid_emails = [email for email in target_email_list if checkmailsyntax(email)]

关于python - 在有效性检查后从 python 列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com