2013-04-22 3 views
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([])] 
+0

Непонятно, что вы хотите. В настоящее время у вас есть список '(email, name)' tuples - что вам нужно? Кортеж списка писем и список имен? –

ответ

6

Это просто сделать с помощью the zip() built-in function:

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

недействительный синтаксис не работает – maazza

+0

@maazza Действительно? Единственное, что я могу придумать, это то, что если вы используете 3.x, кортеж должен иметь скобки в списке comp (я изменил свой ответ, чтобы отразить это), но это существовало в вашем коде, поэтому я предположил, что вы были в 2.x. Если это не так, отправьте всю свою ошибку. –

+0

Я использую 2.7, и теперь я избавился от синтаксической ошибки – maazza

1

Да.

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

Это будет кортеж кортежей, и я не уверен, что это на самом деле то, что происходит после OP. –

+0

Перечитывая вопрос, я думаю, вы совершенно правы. Я думал, что ОП пытается сделать кортеж из понимания списка. Я буду ждать разъяснений по вопросу, а затем отредактировать свой ответ соответственно. –

+0

Да, оригинальный вопрос был невероятно неясным, но я думаю, теперь это ясно. –

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 

это второе решение, ИМО, менее читаемыми и для этого хуже. Это скорее питонический, и более универсальный.

Смежные вопросы