什么是将项目列表分组为特定最大大小的组的最佳python习惯用法?

时间:2009-12-04 21:27:19

标签: python

我想编写一个从列表中获取项目并将它们分组为大小为n的组的函数。

即,对于n = 5,[1,2,3,4,5,6,7]将变为[[1,2,3,4,5],[6,7]]。

最好的python惯用方法是什么?

4 个答案:

答案 0 :(得分:2)

你可以这样做:

[a[x:x+n] for x in range(0, len(a), n)]

(在Python 2中,使用xrange提高效率;在Python 3中使用range,如上所述。)

答案 1 :(得分:1)

我不知道有什么好的命令可以做到这一点,但是这是一种用列表理解来做到这一点的方法:

l = [1,2,3,4,5,6,7]
n = 5
newlist = [l[i:i+n] for i in range(0,len(l),n)]

编辑:正如评论者指出的那样,我不小心把l [i:i + n]放在一个列表中。

答案 2 :(得分:1)

使用带有步骤的范围的解决方案仅适用于列表和元组(非迭代器)等序列。它们也没有那么高效,因为它们多次访问序列而不是迭代它一次。

这是一个支持迭代器的版本,只迭代输入一次,创建一个列表列表:

def blockify(iterator, blocksize):
    """Split the items in the given iterator into blocksize-sized lists.

    If the number of items in the iterator doesn't divide by blocksize,
    a smaller block containing the remaining items is added to the result.

    """
    blocks = []
    for index, item in enumerate(iterator):
        if index % blocksize == 0:
            block = []
            blocks.append(block)
        block.append(item)
    return blocks

现在,返回元组迭代器的迭代器版本没有内存开销,并允许选择是否包含余数。请注意,输出可以通过列表转换为列表(blockify(...))。

from itertools import islice

def blockify(iterator, blocksize, include_remainder=True):
    """Split the items in the given iterator into blocksize-sized tuples.

    If the number of items in the iterator doesn't divide by blocksize and
    include_remainder is True, a smaller block containing the remaining items
    is added to the result; if include_remainder is False the remaining items
    are discarded.

    """
    iterator = iter(iterator) # we need an actual iterator
    while True:
        block = tuple(islice(iterator, blocksize))
        if len(block) < blocksize:
            if len(block) > 0 and include_remainder:
                yield block
            break
        yield block

答案 3 :(得分:0)

[a[n*k:n*(k+1)] for k in range(0,len(a)/n+1)]