Сотни почтовых адресов не должны быть проблемой. Ниже приводится одна строка:
any(domain.endswith(d) for d in MY_DOMAINS)
Здесь вы можете сделать user,sep,domain = address.rpartition('@')
. В противном случае ваш текущий метод не будет работать для адресов электронной почты, таких как "B@tm4n"@something.com
, которые действительны в соответствии с http://tools.ietf.org/html/rfc5322
Если производительность становится фактором, вы можете использовать Trie (разновидность структуры данных). Если производительность по-прежнему является фактором, вы можете использовать другие приемы.
Вышеприведенное относится к каждому элементу проверяемых доменов, поэтому, если в вашем списке 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))