1

リスト内包表記からリストのタプルを作成する方法はありますか?

何かのようなもの:

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

1 つのリストから 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

私はエレガントな 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]

「パートナー」がリストの場合、これは正常に機能するはずです。

それ以外の場合はジェネレーターであり、パートナーのシーケンスを生成するために 2 回要求しないでください。その場合、このコードはより良いものになるはずです:

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

この2番目の解決策は、IMOであり、読みにくいため、さらに悪いことです。ただし、よりPythonicであり、より用途が広いです。

于 2013-04-22T14:39:25.627 に答える