【问题标题】:Segment a list in Python在 Python 中分割列表
【发布时间】:2010-11-16 04:04:12
【问题描述】:

我正在寻找一个 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]]

【问题讨论】:

标签: python list segments


【解决方案1】:

您可以使用列表推导:

>>> 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]]

【讨论】:

  • 你也可以让它成为一个生成器,即 (a[x:x+seg_length] for x in range(0,len(a),seg_length)) 这对于大序列将更有效。
【解决方案2】:

你需要如何使用输出?如果您只需要对其进行迭代,则最好创建一个可迭代的,生成您的组的:

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]

【讨论】:

  • +1。非常明智的做法。如果我的输入数据变大,我会记住这一点。
【解决方案3】:

输出不一样,我还是觉得grouper function很有帮助:

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, 无, 无)]

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2023-03-27
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多