1

有没有办法从列表理解中创建列表元组?

就像是:

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

3 回答 3

6

这只需使用内置zip()函数即可完成:

actual_clients_emails, actual_client_names = zip(
    *[(partner.email, partner.name)
      for partner in op_client.ResPartner.browse([])])
于 2013-04-22T14:22:40.423 回答
1

是的。

client_names = tuple([partner.email, partner.name for partner in op_client.ResPartner.browse([])])
于 2013-04-22T14:21:10.370 回答
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,更通用。

于 2013-04-22T14:39:25.627 回答