Python替换列表

时间:2018-11-08 07:55:03

标签: python list list-comprehension

我有一个列表,其中包含不同的电子邮件格式,我希望将其统一在一起。 电子邮件有两种类型:

name.surname@dom
name.surname.extern@dom

我的程序允许用户输入电子邮件,而不必一直输入"@dom"(总是一样),我所做的就是允许用户编写name.surnamename.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 :(得分:1)

您可以使用字符串的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']

我个人认为列表理解简短且易读时是最好的,所以我会坚持第一个选择。

答案 1 :(得分:0)

不带列表理解的选项:

N = 13 * #slot3 + 4 * #slot2 + #slot1

答案 2 :(得分:0)

如果您想要单线,请将list comprehensionmultiple if/else statements结合使用:

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

答案 3 :(得分:0)

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

希望这会有所帮助。

答案 4 :(得分:0)

最后我提出了另一种解决方案:声明帮助功能。

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

mails = [mailfy(x) for x in mails]