当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能从一个列表理解中获得两个列表?

如何解决《为什么我不能从一个列表理解中获得两个列表?》经验,为你挑选了1个好方法。

所以我有一个以下形式的数组:

[(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: too many values to unpack

所以任何人都可以解释为什么会发生这种情况,如果我想做的话甚至是可能的.

此致,波格丹



1> Lauritz V. T..:

它不起作用,因为长度[(dat[0], dat[2]) for dat in all_data]与长度all_data相同,长度与元组的长度不同(ids, gds).

试试这个:

(ids, gds) = zip(*[(dat[0], dat[2]) for dat in all_data])

甚至更短:

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

正如指出的另一种回答,idsgds现在将元组,所以如果你需要列出,这样做:

(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_func(*some_list) 解包, some_list以便使用some_listas参数元素调用该函数.所以zip(*l)是一样的zip([1, 2, 3], [4, 5, 6]).这是 python教程的相关部分.

zip像拉链一样,因此名称,所以它返回一个包含这些元素的列表:给定参数的所有第一个元素的元组,后跟所有第二个元素的元组,等等.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有