2014-10-11 89 views
0

我有一个元组的列表,我想将每个元组的第一个元素提取到另一个列表。 我一个元组列表称为“列表”,并试图元素提取到名为“列表2”名单,我得到的是:使用列表理解从元组中提取元素

>>> list = [ (1,2), (3,4), (5,6)] 
>>> list2 = [] 
>>> list2 = [] 
>>> [list2[i] = list[i][0] for i in range(len(list))] 
    File "<stdin>", line 1 
    [list2[i] = list[i][0] for i in range(len(list))] 
      ^
SyntaxError: invalid syntax 

你们能帮助找出什么是不对的语法?

回答

0

在列表理解中,只有表达式才会出现。 list2[i] = list[i][0]是转让陈述

而且,您不需要使用索引来访问项目。只需重复列表。

>>> lst = [ (1,2), (3,4), (5,6)] 
>>> lst2 = [x[0] for x in lst] 
>>> lst2 
[1, 3, 5] 

顺便说一句,不要使用list作为变量名称。它阴影内置类型/功能list

+0

非常感谢! 关于列表的事情:我知道,我只在终端(运行时)使用list作为变量名。 – spine 2014-10-11 01:40:04

+2

@coding_brainfart,即使在交互式shell中,我也不推荐使用'list'。一旦你使用它,你不能做如下的事情:'list('abc')'。 – falsetru 2014-10-11 01:42:47

+0

@coding_brainfart - Guido(Python的创建者)推荐使用后缀名称,否则这些名称可能会将内置内容映射为下划线。所以你可以使用'list_'而不是'list',例如。大多数情况下,我发现这里出现了'id_',以避免隐藏内置函数'id'。 – ArtOfWarfare 2014-10-11 01:45:55

2

使用lstlst2作为其他人已注意到的变量名称list是一个不好的选择。

你不需要索引。使用索引通常被认为是不好的形式。

lst2 = [ pair[0] for pair in lst]

如果你真的需要索引,对于一些数学什么的。

lst2 = [ lst[i][0] for (i, pair) in enumerate(lst)]

如果您需要处理数字的2个维矩阵,你可能想了解numpy,并期待在numpy.matrixnumpy.array

0

在循环一行中的列表时,无法使用equals运算符设置变量。你可以简单地做这样的:

list = [ (1,2), (3,4), (5,6)] 
list2 = [] 
[list2.append(list[i]) for i in range(len(list))] 
+0

你可以,但你真的不应该。 :) 1)其他人已经提到使用'list'作为变量名,但我想你只是从问题中复制。 2)使用'for in in range(len(some_list))'很少需要,因为我们可以直接迭代序列类型。 3)'list.append()'返回'None',所以你很浪费地创建一个充满'None'的列表,然后把它扔掉。 – 2014-10-11 04:26:00

0

另一种方式做,这是zip()

>>> lst = [(1,2), (3,4), (5,6)] 
>>> zip(*lst) 
[(1, 3, 5), (2, 4, 6)] 
>>> zip(*lst)[0] 
(1, 3, 5) 
>>> list(zip(*lst)[0]) 
[1, 3, 5] 

然而,这是一个有点浪费时,你只需要一个列表。