为什么块不是python标准库的一部分?

为什么块不是python标准库的一部分?,python,Python,在阅读和看到这种错误一直在发生之后 为什么itertools中没有块函数 编辑: grouperfrom的行为与chunk 例如: chunks([1, 2, 3, 4, 5], 3) # Should return [[1, 2, 3], [4, 5]] or the iterator equivalent. 它不在itertools中,但在itertools的页面上提到它是一种配方: 您可能会问,为什么所有其他配方都没有包含在itertools中:)在这里发布这样的问题并不是将这样的内容

在阅读和看到这种错误一直在发生之后

为什么itertools中没有
函数

编辑:
grouper
from的行为与
chunk

例如:

chunks([1, 2, 3, 4, 5], 3)
# Should return [[1, 2, 3], [4, 5]] or the iterator equivalent.

它不在itertools中,但在itertools的页面上提到它是一种配方:


您可能会问,为什么所有其他配方都没有包含在itertools中:)

在这里发布这样的问题并不是将这样的内容添加到Python中的方法。您应该试试Python邮件列表

我用您要求的语义为您实现了
chunks()
。正确处理最后一个块有点棘手,但在其他方面,这相当容易。如果将它添加到
itertools
中,它将用C编写,因此速度会更快

在Python2.6、Python2.7和Python3.2中测试并使用

import itertools as it
import sys

# use lazy xrange on 2.x; on 3.x plain "range" is always lazy
if sys.version_info[0] < 3:
    _range = xrange
else:
    _range = range

def chunks(iterable, n):
    """
    Yield up lists of n elements, taken from iterable.
    If length of iterable is not evenly divisible by n, the last list will be short.
    """
    if n < 1:
        raise ValueError("n must be >= 1")

    itr = iter(iterable)
    try:
        while True:
            lst = []
            for _ in _range(n):
                lst.append(next(itr))
            if not lst:
                break
            yield lst
    except StopIteration:
        # Only yield up a partial chunk if it is not zero length.
        if lst:
            yield lst

print(list(chunks([1, 2, 3, 4, 5, 6], 3)))  # prints: [[1, 2, 3], [4, 5, 6]]
print(list(chunks([1, 2, 3, 4, 5], 3))) # prints: [[1, 2, 3], [4, 5]]
print(list(chunks([], 3))) # prints: []
print(list(chunks([1, 2], 0))) # raises ValueError exception

但它没有相同的功能<代码>块不会填补最后一个块的空白。@razpeitia如果fillvalue=None,会发生什么?它会用
None
填充,这一点也不例外。@razpeitia:就向标准库添加内容而言,在末尾添加填充将是更常见的实现。例:
对于a,b,c,分块(3,iterable)
。因为它简单明了,可以使用列表理解在一行中实现?@wim这听起来像是我的另一个原因:)滑动窗口迭代器将是我添加到标准库中的另一个迭代器。谢谢,先生!我真的很感谢你的努力,我会尝试一下邮件列表的东西。
import itertools as it
import sys

# use lazy xrange on 2.x; on 3.x plain "range" is always lazy
if sys.version_info[0] < 3:
    _range = xrange
else:
    _range = range

def chunks(iterable, n):
    """
    Yield up lists of n elements, taken from iterable.
    If length of iterable is not evenly divisible by n, the last list will be short.
    """
    if n < 1:
        raise ValueError("n must be >= 1")

    itr = iter(iterable)
    try:
        while True:
            lst = []
            for _ in _range(n):
                lst.append(next(itr))
            if not lst:
                break
            yield lst
    except StopIteration:
        # Only yield up a partial chunk if it is not zero length.
        if lst:
            yield lst

print(list(chunks([1, 2, 3, 4, 5, 6], 3)))  # prints: [[1, 2, 3], [4, 5, 6]]
print(list(chunks([1, 2, 3, 4, 5], 3))) # prints: [[1, 2, 3], [4, 5]]
print(list(chunks([], 3))) # prints: []
print(list(chunks([1, 2], 0))) # raises ValueError exception
def chunks(iterable, n):
    """
    Yield up lists of n elements, taken from iterable.
    If length of iterable is not evenly divisible by n, the last list will be short.
    """
    if n < 1:
        raise ValueError("n must be >= 1")

    itr = iter(iterable)

    while True:
        lst = list(it.islice(itr, n))
        if not lst:
            break
        yield lst