Python 列表划分/分割

0 投票
4 回答
1105 浏览
提问于 2025-04-16 00:52

可能重复的问题:
如何在Python中将列表分割成相同大小的块?

你好,

我正在寻找一种更简单的方法来做以下事情:

def list_split(list, size):
  result = [[]]
  while len(list) > 0:
    if len(result[-1]) >= size: result.append([])
    result[-1].append(list.pop(0))
  return result

示例用法:

>>> list_split([0, 1, 2, 3, 4, 5, 6], 2)
[[0, 1], [2, 3], [4, 5], [6]]
>>> list_split([0, 1, 2, 3, 4, 5, 6], 3)
[[0, 1, 2], [3, 4, 5], [6]]

我不确定是否有内置的方法可以做到这一点,可能是用切片之类的。

这和如何将列表分割成给定数量的子列表的帖子相似,但不完全相同。

谢谢

编辑: 正如Anurag Uniyal所评论的,这个问题与如何将列表分割成相同大小的块?重复,应该被关闭,但我无法做到这一点。

相关问题:

4 个回答

1

你可以在itertools的配方中找到一个简单的功能性解决方案(叫做grouper):

http://docs.python.org/library/itertools.html#recipes

这个函数会添加填充,但你也可以很简单地写一个不带填充的版本,利用一个通常被忽视的内置函数iter,用法是这样的:iter(callable, sentinel) -> iterator

def grouper(n, it):
  "grouper(3, 'ABCDEFG') --> ABC DEF G"
  return iter(lambda: list(itertools.islice(it, n)), [])

list(grouper(3, iter(mylist)))

这些解决方案更通用,因为它们都可以处理序列和可迭代对象(即使是无限的)。

1
def list_split(L, size):
    return [L[i*size:(i+1)*size] for i in range(1+((len(L)-1)//size))]

如果你想用生成器而不是列表,可以把方括号换成圆括号,像这样:

def list_split(L, size):
    return (L[i*size:(i+1)*size] for i in range(1+((len(L)-1)//size)))
9

你可以使用切片来获取列表的子集。

举个例子:

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

撰写回答