你好,
我想在许多 x 元素长度的列表中拆分一个列表,例如:
a = (1, 2, 3, 4, 5)
并得到:
b = (
(1,2),
(3,4),
(5,)
)
如果长度设置为 2 或:
b = (
(1,2,3),
(4,5)
)
如果长度等于 3 ...
有没有写这个的好方法?否则我认为最好的方法是使用迭代器编写它......
你好,
我想在许多 x 元素长度的列表中拆分一个列表,例如:
a = (1, 2, 3, 4, 5)
并得到:
b = (
(1,2),
(3,4),
(5,)
)
如果长度设置为 2 或:
b = (
(1,2,3),
(4,5)
)
如果长度等于 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])
使其返回固定类型。
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))
完毕。
从 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))