Python 为什么可以';我不能从一个列表中得到两个列表吗?

Python 为什么可以';我不能从一个列表中得到两个列表吗?,python,Python,我有一个如下形式的数组: [(1, u'first_type', u'data_gid_1'), (2, u'first_type', u'data_gid_2'), (3, u'first_type', u'data_gid_3'), (4, u'first_type', u'data_gid_4')] 现在我想将每个内部列表的第一个和最后一个元素提取到单独的列表中。因此,如果我这样做: >>> ids = [dat[0] for dat in all_data

我有一个如下形式的数组:

[(1, u'first_type', u'data_gid_1'), 
 (2, u'first_type', u'data_gid_2'), 
 (3, u'first_type', u'data_gid_3'), 
 (4, u'first_type', u'data_gid_4')]
现在我想将每个内部列表的第一个和最后一个元素提取到单独的列表中。因此,如果我这样做:

>>> ids = [dat[0] for dat in all_data]
>>> gds = [dat[2] for dat in all_data]
这是我所期望的。但是我尝试将这两个合并为一个调用,类似于:

 (ids, gds) = [(dat[0], dat[2]) for dat in all_data]
但是,这在以下情况下失败:
ValueError:要解压缩的值太多

那么,有谁能解释为什么会发生这种情况,以及我试图做的事情是否有可能

问候,,
Bogdan不起作用,因为所有数据中dat的
[(dat[0],dat[2])
的长度与
所有数据的长度相同,这与元组
(ID,gds)
的长度不同

请尝试以下方法:

(ids, gds) = zip(*[(dat[0], dat[2]) for dat in all_data])
甚至更短:

(ids, gds) = zip(*all_data)[::2]
如另一个答案所述,
ids
gds
现在将是元组,因此如果需要列表,请执行以下操作:

(ids, gds) = map(list, zip(*all_data)[::2])


zip(*something)
是python中经常出现的一个习惯用法。如果将列表列表视为矩阵,即

l = [[1, 2, 3],
     [4, 5, 6]]
然后
zip(*l)
转换该矩阵:

zip(*l) == [(1, 4),
            (2, 5),
            (3, 6)]
*
的工作原理如下:
some函数(*some列表)
解包
some列表
,这样函数实际上是以
some列表
的元素作为参数调用的。因此
zip(*l)
zip([1,2,3],[4,5,6])
相同。python教程的相关部分

它的行为类似于a,因此它的名称是,因此它返回一个包含这些元素的列表:给定参数的所有第一个元素的元组,后面是所有第二个元素的元组,等等。

[(dat[0],dat[2])对于所有数据中的dat]
意味着您正在创建一个元组列表
(dat[0],dat[2])
。这并不意味着您有两个列表,一个是
d[0]
,另一个是
d[2]

您可以简单地使用
zip
,但这将产生元组。如果需要列表,则必须对结果应用
list

(ids, gds) = map(list,zip(*[(dat[0], dat[2]) for dat in a]))

下面的代码也可以做到这一点:

data = [(1, u'first_type', u'data_gid_1'), 
 (2, u'first_type', u'data_gid_2'), 
 (3, u'first_type', u'data_gid_3'), 
 (4, u'first_type', u'data_gid_4')]

ids, gds = ([row[i] for row in data] for i in [0,2])

由于要创建两个单独的列表,请尝试以下操作:

ids, dgs = [(dat[0]) for dat in all_data], [(dat[2]) for dat in all_data]
或者,您可以使用以下命令将其解压缩到单个列表:

x = [(dat[0], dat[2]) for dat in all_data]

把它分成两行有什么不对吗?我的意思是,有时候说清楚就好了。没什么不对的,这仍然是我正在使用的解决方案,我只是想了解为什么我会得到错误,以备将来使用。@Bogdan,这真的很光荣。我会给你一个+1的评价。很好。虽然有一个更好的解释可以帮助OP:“‘太多的值需要解包’是因为您试图将一个4元素列表分配给一个2元素元组。”+1.感谢您的输入。我想问一下zip()到底是做什么的。谢谢你的澄清。将在时间到期后立即接受。@lazyr对此肯定为+1。