Python List Division / Splitting

时间:2010-07-06 06:14:17

标签: python list split

  

可能重复:
  How do you split a list into evenly sized chunks in 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]]

我无法分辨是否有内置方法可以做到这一点,可能是切片或其他东西。

这与How to split a list into a given number of sub-lists in python

上的帖子类似但不相同

由于

修改的: 正如Anurag Uniyal评论的那样,这是How do you split a list into evenly sized chunks?的副本,应该关闭,我不能这样做。

4 个答案:

答案 0 :(得分: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]]
>>>

答案 1 :(得分: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)))

答案 2 :(得分: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)))

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

答案 3 :(得分:0)

from itertools import izip_longest

def list_split(L, size):
    return [[j for j in i if j is not None] for i in izip_longest(*[iter(L)]*size)]

>>> 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]]
>>> list_split([0, 1, 2, 3, 4, 5, 6], 4)
[[0, 1, 2, 3], [4, 5, 6]]
>>> list_split([0, 1, 2, 3, 4, 5, 6], 5)
[[0, 1, 2, 3, 4], [5, 6]]