Python:从列表中获取许多列表

Python : Get many list from a list

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How do you split a list into evenly sized chunks in Python?

你好,

我想将一个列表拆分为多个x元素长度的列表,例如:


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

得到:

江户十一〔一〕号

如果长度设置为2或:

埃多克斯1〔2〕

如果长度等于3…

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


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

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

用途:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 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(...)替换清单理解[...]。您也可以用tuple(seq[i:i + length])list(seq[i:i + length])替换seq[i:i + length],使其返回固定类型。


从itertools模块上的python文档中:

1
2
3
4
5
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)

例子:

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


ITertools模块文档。读它,学它,爱它。

具体来说,从配方部分:

1
2
3
4
5
6
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)

它给出:

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

这不是你想要的……你不想让None在里面……所以。快速修复:

1
2
>>> tuple(tuple(n for n in t if n) for t in grouper(3, (1,2,3,4,5)))
((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))

它给出:

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

完成。