【发布时间】:2015-10-27 11:55:48
【问题描述】:
我想知道编写生成器表达式的 Pythonic 方法,该表达式采用无限生成器 g 的第一个 n 元素。目前,我正在这样做:
(x for x,_ in zip(g,range(n)))
有没有更 Pythonic 的方式来做到这一点?
【问题讨论】:
我想知道编写生成器表达式的 Pythonic 方法,该表达式采用无限生成器 g 的第一个 n 元素。目前,我正在这样做:
(x for x,_ in zip(g,range(n)))
有没有更 Pythonic 的方式来做到这一点?
【问题讨论】:
islice将itertools.islice 包装在一个函数中会很有意义,代码比我下面的替代方案要短得多:
from itertools import islice
def first_n(iterable, n):
return islice(iterable, 0, n)
及用法:
>>> first_n(range(100), 10)
<itertools.islice object at 0xffec1dec>
>>> list(first_n(range(100), 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
或直接:
>>> list(islice(range(100), 0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这里有一个替代方案:
def first_n(iterable, n):
it = iter(iterable)
for _ in range(n):
yield next(it)
及用法:
>>> first_n(range(100), 10)
<generator object first_n at 0xffec73ec>
>>> list(first_n(range(100), 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
【讨论】:
itertools.islice(g,0,10)
应该这样做吗?
你可能需要list(itertools.islice(g,0,10))(因为它返回一个迭代器)
【讨论】:
来自doc,islice有签名:
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
所以你可以使用:
g2 = itertools.islice(g, 10)
【讨论】: