【问题标题】:Truncating a python generator截断 python 生成器
【发布时间】:2015-10-27 11:55:48
【问题描述】:

我想知道编写生成器表达式的 Pythonic 方法,该表达式采用无限生成器 g 的第一个 n 元素。目前,我正在这样做:

(x for x,_ in zip(g,range(n)))

有没有更 Pythonic 的方式来做到这一点?

【问题讨论】:

    标签: python generator


    【解决方案1】:

    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]
    

    【讨论】:

      【解决方案2】:
      itertools.islice(g,0,10)
      

      应该这样做吗?

      你可能需要list(itertools.islice(g,0,10))(因为它返回一个迭代器)

      【讨论】:

      • 哎呀,我在错误的地方有可迭代的参数
      【解决方案3】:

      来自docislice有签名:

      itertools.islice(iterable, stop)
      itertools.islice(iterable, start, stop[, step])
      

      所以你可以使用:

      g2 = itertools.islice(g, 10)
      

      【讨论】:

        猜你喜欢
        • 2020-10-31
        • 1970-01-01
        • 2014-06-09
        • 2016-01-17
        • 1970-01-01
        • 2013-10-02
        • 2014-01-16
        • 1970-01-01
        • 2011-04-17
        相关资源
        最近更新 更多