从列表中创建列表元组

时间:2013-04-22 14:18:54

标签: python tuples list-comprehension

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

类似的东西:

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([])]

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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,而且功能更多。