在Python中划分列表

13 投票
3 回答
21506 浏览
提问于 2025-04-15 13:20

我在寻找一个Python内置的函数(或者说机制),可以把一个列表分割成需要的段长度(而不改变原来的列表)。下面是我已经写好的代码:

>>> def split_list(list, seg_length):
...     inlist = list[:]
...     outlist = []
...     
...     while inlist:
...         outlist.append(inlist[0:seg_length])
...         inlist[0:seg_length] = []
...     
...     return outlist
... 
>>> alist = range(10)
>>> split_list(alist, 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

3 个回答

2

输出不一样,我还是觉得grouper函数很有用:

from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return izip_longest(*args, fillvalue=fillvalue)

对于没有izip_longest的Python2.4和2.5:

from itertools import izip, chain, repeat
def grouper(iterable, n, padvalue=None):
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)

这里有一些示例代码和输出:

alist = range(10)
print list(grouper(alist, 3))

输出: [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]

5

你需要怎么使用这个输出呢?如果你只是想一个一个地处理它,创建一个可迭代的对象会更好,也就是一个可以逐步返回你需要的组的东西:

def split_by(sequence, length):
    iterable = iter(sequence)
    def yield_length():
        for i in xrange(length):
             yield iterable.next()
    while True:
        res = list(yield_length())
        if not res:
            return
        yield res

使用示例:

>>> alist = range(10)
>>> list(split_by(alist, 3))
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

这样做比一次性把整个列表都放到内存中要节省很多内存,特别是当你只是想循环处理结果时,因为它一次只构建一个子集:

>>> for subset in split_by(alist, 3):
...     print subset
...
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
23

你可以使用列表推导式:

>>> seg_length = 3
>>> a = range(10)
>>> [a[x:x+seg_length] for x in range(0,len(a),seg_length)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

撰写回答