使用列表解析

时间:2017-02-08 09:06:54

标签: python list tuples

假设我有一个元组列表和一个带有两个参数的简单函数:

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

有人能指出我缺少的东西吗?

3 个答案:

答案 0 :(得分: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]

但这只是不必要的罗嗦。

答案 1 :(得分: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]

答案 2 :(得分: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]

而且,正如其他人指出的那样,它是过度设计的,你只需要理解一个for表达,因为a_list已经是对的列表:

>>> [add_it(a,b) for a,b in a_list]
[7, 14]
相关问题