2013-03-02 73 views
0

我基本上试图从多维列表中提取一些数据到一个新列表中。虽然这段代码做我想做的,但我想知道是否有更好的方法来获得这个结果没有循环通过原始列表?来自多维列表的特定索引的新列表?

aa = [ 
    ["a", "aa", "aaa"], 
    ["b", "bb", "bbb"], 
    ["c", "cc", "ccc"], 
] 
b = [] 
for a in aa: 
    b.append(a[1]) 
b 
>> Result: ['aaa', 'bbb', 'ccc'] 
+3

你现在的代码实际上应该返回'['aa','bb','cc']'。这是故意的,还是你的意思是有'a [2]'而不是'a [1]'。 – TerryA 2013-03-02 05:04:44

+0

啊是的,我想我抄了结果的错误部分 – Panupat 2013-03-02 05:47:57

回答

3
>>> aa = [["a", "aa", "aaa"], 
      ["b", "bb", "bbb"], 
      ["c", "cc", "ccc"]] 
>>> b = zip(*aa)[2] 
>>> print b 
['aaa', 'bbb', 'ccc'] 

我很肯定zip仍然遍历列表,但这是一个更加简单的方法来获得所需的结果。

注意的是Python 3,zip返回迭代器,所以你需要转换到一个列表第一

list(zip(*aa))[2] 

,或者使用列表理解

[i[2] for i in aa] 
1

你可以使用列表理解:

b = [aa[i][2] for i in range(len(aa))] 

或更快和更短的搅拌器曾建议

b = [a[2] for a in aa] 
+0

为什么不''[a [2]为aa]'? – Blender 2013-03-02 04:59:00

2

下面是与列表理解方式:

>>> aa = [ 
["a", "aa", "aaa"], 
["b", "bb", "bbb"], 
["c", "cc", "ccc"], 
] 
>>> b = [i[2] for i in aa] 
>>> print b 
['aaa', 'bbb', 'ccc'] 
1

你也可以用numpy的做:

>>> >>> a = numpy.array([ 
...  ["a", "aa", "aaa"], 
...  ["b", "bb", "bbb"], 
...  ["c", "cc", "ccc"], 
... ]) 
>>> a[:,2] 
    array(['aaa', 'bbb', 'ccc'], 
     dtype='|S3')