在python中,在validity ch之后从列表中删除项

2024-09-30 14:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:

我正在写一个小脚本,它需要一个文件中的电子邮件地址列表。脚本将他们继续使用电子邮件地址通过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中),并将其插入(当前为全局)列表中:

^{pr2}$

我想如果checkmailsyntax函数失败,脚本自动从列表中删除一个电子邮件地址(而不是仅仅告诉您它是错误的,这是它过去所做的),这将是非常好的。这个清理后的列表可以继续向SMTP服务器提交语法上有效的电子邮件地址:

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

检查我在delete元素片段之前和之后放入的代码时出错,以查看它是否起作用:

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'和{}被移除,而{}和{}却没有。当文件中连续出现两封语法错误的电子邮件时,似乎会发生这种情况。在

谁能给我指出正确的方向吗?在


Tags: 文件脚本com元素target列表example电子邮件
2条回答

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

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

因为,以下值在一起:

^{pr2}$

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

为此,可以使用列表理解:

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

AKS的答案已经涵盖了你:不要从你正在迭代的列表中删除!为了快速修复,可以在迭代副本时从实际列表中删除:

for i in target_email_list[:]:  # iterates over the slice
    if checkmailsyntax(i):
        target_email_list.remove(i)  # removes from actual list

相关问题 更多 >