如何从Python中的元组列表中提取第n个元素?

我试图从元组列表中获得第n个元素。

我有这样的东西:

elements = [(1,1,1),(2,3,7),(3,5,10)] 

我只想提取每个元组的第二个元素到列表中:

 seconds = [1, 3, 5] 

我知道这可以用for循环来完成,但是我想知道是否有另一种方法,因为我有成千上万的元组。

 [x[1] for x in elements] 

我知道这可以用FOR来完成,但是我想知道是否有另一种方法

还有另一种方法。 你也可以用map和itemgetter来做:

 >>> from operator import itemgetter >>> map(itemgetter(1), elements) 

尽pipe如此,它仍然在内部执行循环,并且比列表理解稍微慢一些:

 setup = 'elements = [(1,1,1) for _ in range(100000)];from operator import itemgetter' method1 = '[x[1] for x in elements]' method2 = 'map(itemgetter(1), elements)' import timeit t = timeit.Timer(method1, setup) print('Method 1: ' + str(t.timeit(100))) t = timeit.Timer(method2, setup) print('Method 2: ' + str(t.timeit(100))) 

结果:

方法1:1.25699996948
方法2:1.46600008011

如果你需要迭代一个列表,那么使用for就没有问题。

这也适用:

 zip(*elements)[1] 

(我主要是张贴这个,向我自己certificate,我已经zip …)

看到它在行动:

 >>> help(zip) 

模块内置帮助内置函数zip:

压缩(…)

zip(seq1 [,seq2 […]]) – > [(seq1 [0],seq2 [0] …),(…)]

返回元组列表,每个元组包含每个参数序列的第i个元素。 返回的列表的长度被截断为最短参数序列的长度。

 >>> elements = [(1,1,1),(2,3,7),(3,5,10)] >>> zip(*elements) [(1, 2, 3), (1, 3, 5), (1, 7, 10)] >>> zip(*elements)[1] (1, 3, 5) >>> 

整洁的事情,我今天学到了:使用*list参数列表来创build一个函数的参数列表…

find这个,因为我正在寻找哪种方式是最快的拉2元组列表的第二个元素。 不是我想要的,但运行相同的testing,如第三种方法所示,再加上testingzip方法

 setup = 'elements = [(1,1) for _ in range(100000)];from operator import itemgetter' method1 = '[x[1] for x in elements]' method2 = 'map(itemgetter(1), elements)' method3 = 'dict(elements).values()' method4 = 'zip(*elements)[1]' import timeit t = timeit.Timer(method1, setup) print('Method 1: ' + str(t.timeit(100))) t = timeit.Timer(method2, setup) print('Method 2: ' + str(t.timeit(100))) t = timeit.Timer(method3, setup) print('Method 3: ' + str(t.timeit(100))) t = timeit.Timer(method4, setup) print('Method 4: ' + str(t.timeit(100))) Method 1: 0.618785858154 Method 2: 0.711684942245 Method 3: 0.298138141632 Method 4: 1.32586884499 

因此,如果你有一个2元组转换为字典,并采取值的速度超过两倍。

 map (lambda x:(x[1]),elements)