2

可能重复:
如何在 Python 中将列表拆分为大小均匀的块?

你好,

我想在许多 x 元素长度的列表中拆分一个列表,例如:

a = (1, 2, 3, 4, 5)

并得到:

b = ( (1,2), (3,4), (5,) )

如果长度设置为 2 或:

b = ( (1,2,3), (4,5) )

如果长度等于 3 ...

有没有写这个的好方法?否则我认为最好的方法是使用迭代器编写它......

4

3 回答 3

3

这就是我的做法。迭代,但在列表理解中。注意类型混合;这可能需要也可能不需要。

def sublist(seq, length):
    return [seq[i:i + length] for i in xrange(0, len(seq), length)]

用法:

>>> sublist((1, 2, 3, 4, 5), 1)
[(1,), (2,), (3,), (4,), (5,)]

>>> sublist([1, 2, 3, 4, 5], 2)
[[1, 2], [3, 4], [5]]

>>> sublist('12345', 3)
['123', '45']

>>> sublist([1, 2, 3, 4, 5], 73)
[[1, 2, 3, 4, 5]]

>>> sublist((1, 2, 3, 4, 5), 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in sublist
ValueError: xrange() arg 3 must not be zero

当然,tuple如果你愿意,你也可以很容易地让它产生 - 用 . 替换列表推导[...]tuple(...)。您还可以替换seq[i:i + length]tuple(seq[i:i + length])list(seq[i:i + length])使其返回固定类型。

于 2010-11-13T01:14:58.210 回答
2

itertools 模块文档。读它,学习它,爱它。

具体来说,从食谱部分:

import itertools

def grouper(n, iterable, fillvalue=None):
  "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
  args = [iter(iterable)] * n
  return itertools.izip_longest(fillvalue=fillvalue, *args)

这使:

>>> tuple(grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5, None))

这不是你想要的......你不想None在那里......所以。快速修复:

>>> tuple(tuple(n for n in t if n) for t in grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5))

如果您不喜欢每次都输入列表推导式,我们可以将其逻辑移到函数中:

def my_grouper(n, iterable):
  "my_grouper(3, 'ABCDEFG') --> ABC DEF G"
  args = [iter(iterable)] * n
  return tuple(tuple(n for n in t if n)
       for t in itertools.izip_longest(*args))

这使:

>>> tuple(my_grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5))

完毕。

于 2010-11-13T01:37:14.127 回答
2

从 itertools 模块上的 python 文档:

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

例子:

>>> tuple(grouper(3, (1, 2, 3, 4, 5, 6, 7)))
((1, 2, 3), (4, 5, 6), (7, None, None))
于 2010-11-13T01:44:39.597 回答