понимание списка python распаковка нескольких возвратов - PullRequest
2 голосов
/ 20 февраля 2011

У кого-нибудь есть идеи, как распаковать значения в кортеже для понимания списка?

Итак, практический пример:

def func(x,y):
    return x*2, y*2

x = [1, 2, 3]; y = [1, 2, 3]

a, b = [ func(i,j) for i, j in zip(x,y) ] 

К сожалению, из-за этого я получаю сообщение об ошибке.слишком много значений для распаковки ...

Я пробовал

zip(*func(i,j)) 
(a,b) = ...

Ответы [ 3 ]

7 голосов
/ 20 февраля 2011

Вы имеете в виду следующее?:

a, b = zip(*[func(i,j) for i, j in zip(x,y)])
1 голос
/ 20 февраля 2011

Проблема в том, что понимание списка возвращает что-то вроде

[(1,1), (4,4), (6,6),..]

поэтому список содержит более двух элементов.

Я не понимаю, почему ты не можешь просто сделать:

a = [i*2 for i in x]
b = [i*2 for i in y]

Если вас беспокоит дубликат кода, создайте функцию:

def func(l):
    return [i*2 for i in l]

a, b = func(x), func(y)

Попытка упаковать все в одну строку, используя распаковку необычного списка и т. Д., Не обязательно повышает удобочитаемость.

1 голос
/ 20 февраля 2011
for x1,y1 in [func(i,j) for i, j in zip(x,y)]:
     # do something with x1,y1
...