Python заменить в списке

У меня есть список с разным форматом электронной почты, который я хочу объединить в одном. Есть 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.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
338
5

Ответы 5

Вы можете использовать строковый метод 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]

Другие вопросы по теме