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

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

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

  1. def email_list(domains):
  2. emails = []
  3. for users in domains.values():
  4. for user in users:
  5. emails.append(user)
  6. if user in domains["gmail.com"]:
  7. return [x + "@gmail.com" for x in emails]
  8. elif user in domains["yahoo.com"]:
  9. return [x + "@yahoo.com" for x in emails]
  10. elif user in domains["hotmail.com"]:
  11. return [x + "@hotmail.com" for x in emails]
  12. print(email_list({"gmail.com": ["clark.kent", "diana.prince", "peter.parker"], "yahoo.com": ["barbara.gordon", "jean.grey"], "hotmail.com": ["bruce.wayne"]}))

输出仅返回:

  1. ['clark.kent@gmail.com']

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

daolsyd0

daolsyd01#

我想这就是你想要的

  1. def email_list(domains):
  2. emails = []
  3. for users in domains.values():
  4. for user in users:
  5. if user in domains["gmail.com"]:
  6. emails.append(user + "@gmail.com")
  7. elif user in domains["yahoo.com"]:
  8. emails.append(user + "@yahoo.com")
  9. elif user in domains["hotmail.com"]:
  10. emails.append(user + "@hotmail.com")
  11. return emails
  12. print(email_list({"gmail.com": ["clark.kent", "diana.prince", "peter.parker"], "yahoo.com": ["barbara.gordon", "jean.grey"], "hotmail.com": ["bruce.wayne"]}))

输出:

  1. ['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 ... 语句执行时,函数结束。因此,代码的其余部分没有任何用处。
你可以做一个紧凑的解决方案。
以下是您可以做的:

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

或者更紧凑

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

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

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

u59ebvdq3#

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

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

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

  1. def email_list(domains):
  2. emails = [
  3. f"{user}@{domain}"
  4. for domain, users in domains.items()
  5. for user in users
  6. ]
  7. return emails
  8. print(
  9. email_list(
  10. {
  11. "gmail.com": ["clark.kent", "diana.prince", "peter.parker"],
  12. "yahoo.com": ["barbara.gordon", "jean.grey"],
  13. "hotmail.com": ["bruce.wayne"],
  14. }
  15. )
  16. )

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

展开查看全部

相关问题