列表理解期间无法拆包返回的元组

时间:2018-06-27 17:59:04

标签: python python-3.x

我有一个接受输入并返回3项元组的函数:

def f(a, b):
    x = a + 1
    y = x + 2
    z = y + 3
    return (x, y, z)

我从一组元组开始:

my_set = {(1, 2), (3, 4), ... (m, n)}

我需要构建一个列表,但是以下操作会引发TypeError:

[(a, b, x, y, z, (x, y, z)) for a, b in my_set for x, y, z in f(a, b)]
TypeError: 'int' object is not iterable

我正在查看this帖子,该帖子显示了类似的过程,但是由于某种原因,for x, y, z ...引发了异常,并且我不确定是否只是忽略了一些小问题。

2 个答案:

答案 0 :(得分:5)

f(a, b)解压缩到x, y, z中是有效的,但这不是您要执行的操作。 for x, y, z in f(a, b)尝试解包f(a, b)每个元素,就好像每个元素是一个单独的三元组。

您正在寻找的是一种将f(a, b)分配给列表理解中的某项而不进行迭代的方法。有一些解决方法,但是我建议只使用普通循环:

l = []
for a, b in my_set:
    x, y, z = f(a, b)
    l.append((a, b, x, y, z, (x, y, z)))

如果您真的想使用列表理解,一种解决方法是遍历虚拟列表[f(a, b)]而不是f(a, b)

[(a, b, x, y, z, (x, y, z)) for a, b in my_set for x, y, z in [f(a, b)]]

答案 1 :(得分:1)

让我们了解您的一线。这是您实际上在做什么:

for a, b in my_set:
    for i in f(a, b):
        print(i)

a函数b中的每个my_setf计算。它输出一个元组,然后在该元组上迭代i

由于元组中的每一项都是整数,for x, y, z in f(a, b)不起作用。整数不能分为几个部分。

您需要:

[(a, b, *f(a, b), f(a, b)) for a, b in my_set]

如果效率很重要,则需要for循环:

output = list()
for a, b in my_set:
    x, y, z = f(a, b)
    output.append((a, b, x, y, z, (x, y, z))