У меня есть список с разным форматом электронной почты, который я хочу объединить в одном. Есть 2 типа писем:
name.surname@dom
name.surname.extern@dom
Моя программа позволяет пользователю вводить электронные письма и не вводить "@dom" все время (он всегда один и тот же), я разрешил пользователю писать name.surname или name.surname.e, а затем сценарий заменяет эти имена пользователей на @dom. или .extern@dom
Проблема возникает, когда у меня в списке хранятся все письма в разных форматах, и я хочу, чтобы они были заполнены в соответствии со стандартами, чтобы, если у меня есть
["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
все заканчивается так
["john.doe@dom", "john2.doe@dom", "john3.doe.extern@dom","john4.doe.extern@dom"]
Я пробовал с пониманием списков, но все, что у меня было, это три конкатенации:
["%s.xtern@dom" % x for x in mails if x[-2:] == ".e"] +
["%s@dom" %x for x in mails if "@dom not in mails" and x[-2:] != ".e"] +
[x for x in mails if "@dom" in x]
Я уверен, что есть лучший способ, который не требует от меня понимания трех списков и не требует от меня выполнения
for i,v in enumerate(mails):
if "@dom" not in v:
mails[i] = "%s@dom" % v
etc.






Вы можете использовать строковый метод endswith(), чтобы определить, что вам нужно делать с вводом:
mails = ["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
final_mails = []
for mail in mails:
if mail.endswith("@dom"):
# Use as-is if it ends with @dom.
final_mails.append(mail)
elif mail.endswith(".e"):
# Replace to extern@dom if it ends with .e
final_mails.append(mail.replace(".e", ".extern@dom"))
else:
# Add @dom on all other cases
final_mails.append("{}@dom".format(mail))
print final_mails
# Result: ['john.doe@dom', 'john2.doe@dom', 'john3.doe.extern@dom', 'john4.doe.extern@dom']
Возможно, потребуется более тщательная проверка, чтобы не принимать такие вещи, как @dom, прямо в середине имени и так далее. Надеюсь, это поможет вам!
Редактировать: Просто для удовольствия, если вы настаиваете на понимании списка:
mails = ["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
final_mails = ["{}@dom".format((mail.replace(".e", ".extern@dom")
if mail.endswith(".e") else mail).rstrip("@dom"))
for mail in mails]
print final_mails
# Result: ['john.doe@dom', 'john2.doe@dom', 'john3.doe.extern@dom', 'john4.doe.extern@dom']
Лично я считаю, что составление списков лучше всего, когда они короткие и удобочитаемые, поэтому я бы остановился на первом варианте.
Вариант без списка понятий:
maillist = ["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
for i in range(len(maillist)):
if "@" not in maillist[i]:
if maillist[i][-2:]== ".e":
maillist[i] += ("xtern@dom")
else:
maillist[i] += "@dom"
если вы хотите однострочник, объедините понимание списка с несколько операторов if / else:
first_list = ["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
second_list = [email + 'xtern@dom' if email.endswith(".e") else \
email if email.endswith("@dom") else "{}@dom".format(email) \
for email in first_list]
print second_list
Дает:
['john.doe@dom', 'john2.doe@dom', 'john3.doe.extern@dom', 'john4.doe.extern@dom']
@Green Cell был быстрее меня, и его ответ кажется правильным. Вот понимание списка, которое делает то же самое:
mails = ["john.doe@dom", "john2.doe", "john3.doe.e","john4.doe.extern@dom"]
print mails
mails = [mail if mail.endswith("@dom") else mail.replace(".e", ".extern@dom") if mail.endswith(".e") else "{}@dom".format(mail) for mail in mails]
print mails
Какие выходы:
['john.doe@dom', 'john2.doe', 'john3.doe.e', 'john4.doe.extern@dom']
['john.doe@dom', 'john2.doe@dom', 'john3.doe.extern@dom', 'john4.doe.extern@dom']
Надеюсь это поможет.
В конце концов, я пришел с другим решением: объявить функцию справки.
def mailfy(mail):
if mail.endswith(".c"):
return mail[:-2] + "@dom"
...
mails = [mailfy(x) for x in mails]