如何从元组列表中提取第n个元素
我想从一个包含多个元组的列表中获取第n个元素。
我有这样的东西:
elements = [(1,1,1),(2,3,7),(3,5,10)]
我想把每个元组的第二个元素提取出来,放到一个列表里:
seconds = [1, 3, 5]
我知道可以用一个for
循环来实现,但我想知道有没有其他的方法,因为我有成千上万个元组。
8 个回答
我知道可以用FOR循环来做,但我想知道有没有其他的方法。
其实还有其他的方法。你也可以用map和itemgetter来实现:
>>> from operator import itemgetter
>>> map(itemgetter(1), elements)
不过,这种方法内部还是会进行循环,而且比列表推导式稍微慢一点:
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)))
结果:
Method 1: 1.25699996948 Method 2: 1.46600008011
如果你需要遍历一个列表,使用for
循环是完全可以的。
这个方法也可以用:
zip(*elements)[1]
(我发这个主要是为了证明我理解了 zip
的用法……)
看看它是怎么工作的:
>>> help(zip)
关于内置函数
zip
的帮助信息,来自 builtin 模块: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
可以创建一个参数列表……
注意:在 Python3 中,zip
返回的是一个迭代器,所以要用 list(zip(*elements))
来返回一个元组的列表。
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把水从一个杯子倒到另一个杯子一样。
在这个过程中,我们可能会遇到一些问题,比如数据格式不对,或者数据不完整。这就像是你想把水从一个杯子倒到另一个杯子,但发现杯子有个洞,水漏了。
为了避免这些问题,我们需要确保在处理数据之前,先检查一下数据的状态。这样可以确保我们在操作时不会出错,就像在倒水之前先检查一下杯子有没有破损。
总之,处理数据的时候,仔细检查和验证是非常重要的,这样才能保证我们的程序运行得顺利。
n = 1 # N. . .
[x[n] for x in elements]