如何从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)