数以百计的邮件地址不应该是一个问题。以下是一行:
any(domain.endswith(d) for d in MY_DOMAINS)
在这里,你可以做user,sep,domain = address.rpartition('@')
。否则,如果性能成为一个因素当前的方法将电子邮件地址,如"[email protected]"@something.com
,根据http://tools.ietf.org/html/rfc5322
这是有效的失败,你可以使用一个特里(一种数据结构)。如果性能仍然是一个因素,您可以使用其他技巧。
上面介绍了您正在检查的域中的每个元素,因此如果您的列表中有1000个域,则需要为每个电子邮件地址执行1000次查找。如果这是一个问题,您可以通过这种方式实现每个查询O(1)
(您可能还想确保不会检查超过5个后缀,以防止恶意制作的电子邮件地址)。
MY_DOMAINS = set(MY_DOMAINS)
def suffixes(domain):
"""
suffixes('foo.bar.com') -yields-> ['foo.bar.com', 'bar.com', 'com']
"""
while True:
yield domain
parts = domain.split('.',1)
if len(parts>1)
domain = parts[1]
else:
break
def isInList(address):
user,sep,domain = address.rpartition('@')
return any(suffix in MY_DOMAINS for suffix in suffixes(domain))
使用'.partition(“@”)[2]'将失败某些类型的电子邮件地址。有关如何操作,请参阅http://stackoverflow.com/questions/5908190/searching-a-string-in-a-list-in-python/5908265#5908265。 – ninjagecko 2011-05-06 07:59:49