Python中邮件列表的高效处理

2024-04-19 15:50:51 发布

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

我有一个很长的电子邮件列表,我想处理:

  1. 区分好邮件和坏邮件,以及
  2. 删除重复项,但保持所有非重复项的顺序相同。你知道吗

到目前为止,我的情况是:

email_list = ["joe@example.com", "invalid_email", ...]
email_set = set()
bad_emails = []
good_emails = []
dups = False
for email in email_list:
    if email in email_set:
        dups = True
        continue
    email_set.add(email)
    if email_re.match(email):
        good_emails.append(email)
    else:
        bad_emails.append(email)

我希望这段代码尽可能快,并且不那么重要,以最小化内存需求。在Python中有没有改进的方法?可能使用列表理解或迭代器?你知道吗

编辑:对不起!忘记提到这是Python2.5,因为这是针对GAE的。你知道吗

电子邮件来自django.core.validators验证程序你知道吗


Tags: in列表if顺序电子邮件email邮件list
2条回答

我想不出任何办法来加快你的速度。使用set来跟踪事物很快,使用list来存储列表也很快。你知道吗

我喜欢OrderedSet解决方案,但我怀疑OrderedSet的Python实现会比您编写的更快。你知道吗

您可以使用OrderedDict来解决这个问题。但这是为Python2.7添加的。你可以使用一个配方(比如:http://code.activestate.com/recipes/576693/)来添加OrderedDict,但我认为它不会比你所拥有的更快。你知道吗

我正在尝试使用一个用C实现的Python模块来解决这个问题。我想这是打败你的唯一希望。但我什么都没想到。你知道吗

如果您可以去掉dups标志,那么只需运行较少的Python代码,速度就会更快。你知道吗

有趣的问题。祝你好运。你知道吗

查看:Does Python have an ordered set?,然后选择一个您喜欢的实现。你知道吗

所以只要:

email_list = OrderedSet(["joe@example.com", "invalid_email", ...])

bad_emails = [] 
good_emails = []

for email in email_list:
    if email_re.match(email):
        good_emails.append(email)
    else:
        bad_emails.append(email)

可能是最快和最简单的解决方案,你可以实现。你知道吗

相关问题 更多 >