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 |
号
当然,如果你愿意的话,你也可以很容易地让它产生一个
从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)) |
。
这不是你想要的……你不想让
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)) |
。
完成。