2017-02-08 3 views
2

Скажут, у меня есть список кортежей и простая функция, которая принимает два аргумента:Кортеж распаковки в функцию со списком пониманием

a_list = [(1,6), (6,8)] 
add_it(a + b) 

Теперь я хочу, чтобы распаковать кортеж в функцию. Я знаю, что могу сделать это с помощью индексов:

l = [add_it(tup[0], tup[1]) for tup in a_list] 

Но я своего рода ожидаемый это будет работать, тоже:

l = [add_it(a, b) for tup in a_list for a, b in tup] 

Поскольку это работает:

tup = (3,5) 
a, b = tup 
>>> 3 5 

Может кто-то момент меня к тому, что Мне не хватает?

ответ

2

Потому что в вашем внутреннем for заявлении вы итерация над кортежем, так что вы не можете его распаковать. Вы распаковываете отдельные элементы последовательности. Если бы это был набор пар или список пар, тогда это сработало бы.

>>> a_list = [(1,6), (6,8)] 
>>> b_list = [[(1,6)], [(6,8)]] 
>>> def add_it(a, b): return a+b 
... 
>>> l = [add_it(a, b) for tup in a_list for a, b in tup] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <listcomp> 
TypeError: 'int' object is not iterable 
>>> l = [add_it(a, b) for tup in b_list for a, b in tup] 
>>> l 
[7, 14] 

И, как указывалось другими, это overengineered, вам нужно только одно for выражение в вашем понимании, так как a_list уже список пар:

>>> [add_it(a,b) for a,b in a_list] 
[7, 14] 
2

Вы должны сделать:

l = [add_it(a, b) for a, b in a_list] 
# or 
l = [add_it(*tup) for tup in a_list] 

потому

a, b in tup не может работать как tup не содержит пар, a_list делает! Перевод с вашей вложенной логики, которая была бы:

l = [add_it(*(x for x in tup)) for tup in a_list] 

Но это просто излишне многословным.

2

не требуется двойная петля. Просто распаковать в аргументах петлевых

l = [add_it(tup[0], tup[1]) for tup in a_list] 

становится

l = [add_it(a,b) for a,b in a_list] 

примечание: это будет работать, а также (распаковка аргументы):

l = [add_it(*tup) for tup in a_list] 
+0

Я сожалею о публикации 2 квазиподобные ответы раньше. Все поняли, что это был технический вопрос :) –

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