【发布时间】:2010-01-13 04:31:02
【问题描述】:
假设我有一个元组数组,s,形式为:
s = ((1, 23, 34),(2, 34, 44), (3, 444, 234))
我想返回另一个元组 t,它由每行的第一个元素组成:
t = (1, 2, 3)
哪种方法最有效?我当然可以只遍历 s,但是有什么更巧妙的方法吗?
【问题讨论】:
假设我有一个元组数组,s,形式为:
s = ((1, 23, 34),(2, 34, 44), (3, 444, 234))
我想返回另一个元组 t,它由每行的第一个元素组成:
t = (1, 2, 3)
哪种方法最有效?我当然可以只遍历 s,但是有什么更巧妙的方法吗?
【问题讨论】:
没有。
t = tuple(x[0] for x in s)
【讨论】:
Ignacio 给出的列表推导方法是最干净的。
只是为了好玩,你也可以这样做:
zip(*s)[0]
*s 将s 扩展为参数列表。所以相当于
zip( (1, 23, 34),(2, 34, 44), (3, 444, 234))
而zip 返回n 元组,其中每个元组包含每个列表中的nth 项。
【讨论】:
import itertools
s = ((1, 23, 34),(2, 34, 44), (3, 444, 234))
print(next(itertools.izip(*s)))
itertools.izip 返回一个迭代器。 next 函数从迭代器返回下一个(在本例中为第一个)元素。
在 Python 2.x 中,zip 返回一个元组。
izip 使用更少的内存,因为迭代器在需要之前不会生成它们的内容。
在 Python 3 中,zip 返回一个迭代器。
【讨论】: