數以百計的郵件地址不應該是一個問題。以下是一行:
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