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

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

0 голосов
/ 08 ноября 2018

У меня есть список с различным форматированием электронной почты, который я хочу объединить все в одном. Существует 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]

Я уверен, что есть лучший способ, который не требует, чтобы я делал 3 списка, и который не требует, чтобы я делал

for i,v in enumerate(mails):
    if "@dom" not in v:
        mails[i] = "%s@dom" % v
    etc.

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

В итоге я пришел с другим решением: объявить функцию помощи.

def mailfy(mail):
   if mail.endswith(".c"):
     return mail[:-2] + "@dom"
   ...

mails = [mailfy(x) for x in mails]
0 голосов
/ 08 ноября 2018

@ 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']

Надеюсь, это поможет.

0 голосов
/ 08 ноября 2018

Вариант без списков:

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"
0 голосов
/ 08 ноября 2018

, если вам нужен однострочный, объедините понимание списка с множественными операторами 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']
0 голосов
/ 08 ноября 2018

Вы можете использовать метод строки 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 прямо в середине имени и еще много чего. Надеюсь, что это поможет вам, хотя!

Edit: Просто для удовольствия, если вы настаиваете на понимании списка:

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']

Лично я считаю, что списочные понимания лучше всего, когда они короткие и удобочитаемые, поэтому я бы остановился на первом варианте.

...