【问题标题】:Create a tuple of lists from a list从列表创建列表元组
【发布时间】:2013-04-22 14:18:54
【问题描述】:

有没有办法从列表推导式中创建一个列表元组?

类似:

actual_clients_emails, actual_client_names = [partner.email, partner.name for partner in op_client.ResPartner.browse([])]

我想从一个列表中创建 2 个列表。

我可以这样做:

actual_clients_emails = [partner.email for partner in op_client.ResPartner.browse([])]
actual_client_names = [partner.name for partner in op_client.ResPartner.browse([])]

【问题讨论】:

  • 不清楚你想要什么。你目前有一个(email, name) 元组列表——你想要什么?电子邮件列表和姓名列表的元组?

标签: python tuples list-comprehension


【解决方案1】:

这只需使用the zip() built-in function

actual_clients_emails, actual_client_names = zip(
    *[(partner.email, partner.name)
      for partner in op_client.ResPartner.browse([])])

【讨论】:

  • @maazza 真的吗?我唯一能想到的是,如果您使用的是 3.x,则元组需要在列表 comp 中有方括号(我已经更改了答案以反映这一点),但这存在于您的代码中,所以我假设您在2.x。如果不是这样,请发布您的整个错误。
【解决方案2】:

是的。

client_names = tuple([partner.email, partner.name for partner in op_client.ResPartner.browse([])])

【讨论】:

  • 这将是一个元组的元组,我不确定这是否真的是 OP 所追求的。
  • 在重新阅读这个问题时,我认为你是对的。我认为 OP 试图从列表理解中创建一个元组。我将等待问题得到澄清,然后相应地编辑我的答案。
  • 是的,最初的问题非常不清楚,但我认为现在很清楚了。
  • 我赞成你的回答,我会保持原样,因为你已经给出了正确的答案。
【解决方案3】:

我喜欢优雅的一行代码,但在这种情况下,为了清楚起见,我更愿意将其拆分:

partners = op_client.ResPartner.browse([]) # get the partners list
actual_clients_emails = [p.email for p in partners]
actual_client_names = [p.name for p in partners]

如果“合作伙伴”是一个列表,这应该可以正常工作。

如果否则它是一个生成器,则您不应要求它两次来生成您的合作伙伴序列。在这种情况下,这段代码应该会更好:

partners = op_client.ResPartner.browse([]) # get the partners generator
mail_name_generator = ((p.email, p.name) for p in partners) # generator for your info
email, names = zip(*mail_name_generator) # unpack it

第二个解决方案,IMO,可读性较差,因此更糟。但它更 Pythonic,更通用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2022-12-08
    • 2015-10-16
    • 2013-05-29
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多