Python 在列表理解过程中解包返回的元组时出现问题

Python 在列表理解过程中解包返回的元组时出现问题,python,python-3.x,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)} 我需要建立一个列表,但下面抛出一个类型错误: [(a, b, x, y, z, (x, y, z)) for a, b in my_set for x, y, z in f(a, b)] TypeErr

我有一个函数,它接受输入并返回一个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)}
我需要建立一个列表,但下面抛出一个类型错误:

[(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

我正在查看显示了类似过程的帖子,但出于某种原因,
对于x,y,z…
抛出了异常,我不确定我是否忽略了一些小的东西。

f(a,b)
解包到
x,y,z
中是有效的,但这不是你正在做的<编码>对于f(a,b)中的x,y,z尝试将
f(a,b)
中的每个元素解包,就像每个元素是一个单独的3元组一样

您正在寻找的是一种在列表理解中为某个内容分配
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)))
如果您真的想使用列表理解,一种解决方法是在虚拟列表上循环,而不是在虚拟列表上循环


让我们了解一下你的一句台词。以下是您实际正在做的事情:

for a, b in my_set:
    for i in f(a, b):
        print(i)
对于
my_set
函数
f
中的每个
a
b
。它输出一个元组,然后在元组上迭代
i

因为元组中的每一项都是整数,所以f(a,b)中x,y,z的
不起作用。整数不能拆分为几个分数

你需要:

[(a, b, *f(a, b), f(a, b)) for a, b in my_set]
如果效率很重要,您需要对
循环执行

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

例外情况是什么?类型错误是什么?您刚才是否尝试更改参数的顺序<代码>[(a,b,x,y,z,(x,y,z))用于f中的x,y,z(a,b)用于我的集合中的a,b]
@scharetteUpdated@ltd9938UpdatedEh,我在找一个傻瓜,但找不到正确的关键字。这就行了。很好的解释。是的,在我看来,我认为我可以将
转换为x,y,z
,以等同于
*
操作符(解包)。但现在我看到,这就像试图将元组中的每个整数分成3部分。如果我们能
[(a,b,x,y,z,(x,y,z)),对于a,b,在我的集合中x,y,z在*f(a,b)]
中,这将像是一个(虚构的)
where
关键字<代码>[(a,b,x,y,z,(x,y,z)),用于a,b,在my_集合中,其中x,y,z=f(a,b)]。有趣的是,在这个地方,Haskell中的对应词会更加简洁<代码>[let(x,y,z)=f a b in(a,b,x,y,z,(x,y,z))|(a,b)一行:真。有效:假。这需要调用
f()
的次数的两倍。
output = list()
for a, b in my_set:
    x, y, z = f(a, b)
    output.append((a, b, x, y, z, (x, y, z))