如何从zip中只解包部分参数,而不是全部?

10 投票
3 回答
4253 浏览
提问于 2025-04-17 11:19

我的SQL查询是:

select id,value,zvalue from axis

这个查询给我的结果是这样的:

ans=(1,23,34)(12,34,35)(31,67,45)(231,3412,234)

现在如果我想把这3个变量分成3个不同的列表

id, value, zvalue = zip(*ans)

但是如果我只想把idvalue作为单独的列表,这样会出现值太多无法拆分的错误

id, value = zip(*ans)

有没有办法让我可以从SQL查询中创建任意数量的列表?因为如果查询中有10个参数,我在使用ZIP的时候就必须用到所有的参数?

3 个回答

1

我觉得你可能在找这样的东西:

ids = [t[0] for t in ans]
values = [t[1] for t in ans]

第一个列表推导式是从所有的元组中提取第一列,也就是 ans 里的 id 列。第二个列表推导式则是提取所有元组中的第二列,也就是 value 列。

3

如果你在使用Python 3,可以用这个方法来解包额外的n个元素:

In [0]: a, b, *_ = (1, 2, 3, 4)

In [1]: a
1
16

在Python 2中,参数的数量必须完全匹配,这是一个规则。而在Python 3中,你可以用*来把多余的参数收集到一个列表里。

在Python 2中,常见的解决办法是用_来表示那些你不打算使用的变量,比如:

id,value,_ = zip(*ans) # only works for exactly three values

正如DSM所说,在Python 3中,你可以用*来把“剩下的”参数抓取成一个列表:

id, value, *_ = zip(*ans) # _ will be a list of zero or more args

或者,最简单的方法就是直接对zip的返回结果进行切片:

id,value = zip(*ans)[:2] # ignore all but first two values  

撰写回答