函数使用列表理解只返回1个元素?

q8l4jmvw  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(358)

我正在开发一个函数,该函数以一个字典和一个电子邮件域为键,以一个人员列表为值。
代码如下:

def email_list(domains):
    emails = []
    for users in domains.values():
      for user in users:
        emails.append(user)
        if user in domains["gmail.com"]:
            return [x + "@gmail.com" for x in emails]
        elif user in domains["yahoo.com"]:
            return [x + "@yahoo.com" for x in emails]
        elif user in domains["hotmail.com"]:
            return [x + "@hotmail.com" for x in emails]

print(email_list({"gmail.com": ["clark.kent", "diana.prince", "peter.parker"], "yahoo.com": ["barbara.gordon", "jean.grey"], "hotmail.com": ["bruce.wayne"]}))

输出仅返回:

['clark.kent@gmail.com']

有人能解释一下发生了什么以及如何修复它吗??

daolsyd0

daolsyd01#

我想这就是你想要的

def email_list(domains):
    emails = []
    for users in domains.values():
        for user in users:
            if user in domains["gmail.com"]:
                emails.append(user + "@gmail.com")
            elif user in domains["yahoo.com"]:
                emails.append(user + "@yahoo.com")
            elif user in domains["hotmail.com"]:
                emails.append(user + "@hotmail.com")

    return emails

print(email_list({"gmail.com": ["clark.kent", "diana.prince", "peter.parker"], "yahoo.com": ["barbara.gordon", "jean.grey"], "hotmail.com": ["bruce.wayne"]}))

输出:

['clark.kent@gmail.com', 'diana.prince@gmail.com', 'peter.parker@gmail.com', 'barbara.gordon@yahoo.com', 'jean.grey@yahoo.com', 'bruce.wayne@hotmail.com']
z9gpfhce

z9gpfhce2#

A. return 关键字标记函数的结尾。在代码中,只要 return ... 语句执行时,函数结束。因此,代码的其余部分没有任何用处。
你可以做一个紧凑的解决方案。
以下是您可以做的:

def email_list(domains):
    emails = [[user+"@"+server  for user in users ] for server,users in domains.items()]
    return emails

或者更紧凑

def email_list(domains):
    return [[user+"@"+server  for user in users ] for server,users in domains.items()]

如果要将所有电子邮件地址放在一个列表中,可以执行以下操作:

return [user+"@"+server for server,users in domains.items() for user in users]
u59ebvdq

u59ebvdq3#

让我们浏览一下代码。当你遇到 emails.append(user) 第一次,, user 是“克拉克,肯特”。接下来,您遇到了以下块:

if user in domains["gmail.com"]:
            return [x + "@gmail.com" for x in emails]

在这一点上,, emails['clark.kent'] ,所以你的列表理解结果是 ['clark.kent@gmail.com'] 你把它还给我。这里的问题是,您一看到第一个用户就返回。
我的做法如下:

def email_list(domains):
    emails = [
        f"{user}@{domain}"
        for domain, users in domains.items()
        for user in users
    ]
    return emails

print(
    email_list(
        {
            "gmail.com": ["clark.kent", "diana.prince", "peter.parker"],
            "yahoo.com": ["barbara.gordon", "jean.grey"],
            "hotmail.com": ["bruce.wayne"],
        }
    )
)

请注意,我根本不需要测试域。相反,我只是使用域(键)来构造电子邮件地址。还要注意,我的列表理解是双循环的,但它们与代码是同一个循环。

相关问题