我有一个列表,其中包含不同的电子邮件格式,我希望将其统一在一起。 电子邮件有两种类型:
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.
答案 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 comprehension与multiple 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]