我正在寻找一些内置函数或任何优雅的方式,这些功能或方式都可以将一个可迭代对象拆分为多个相等长度的子可迭代对象(最后一个除外)。 我的目标是要有一种方法可以轻松地通过嵌套循环迭代整个过程,因为我需要每10次迭代运行一些代码。
我浏览了itertools
函数,但找不到所需的内容。我觉得我的问题不是那么奇特,所以我很惊讶没有找到解决方法。
这是我期望的行为(以及我同时使用的功能):
def split_iterable(iterable,n_splits=None,len_splits=None):
"""
Splits an iterable into a nested list
only one of n_splits or len_splits has to be specified :
if n_splits is specified, the iterable is splited in n chunks
if len_splits is specified, the iterable is splited in chunks of length len_splits
"""
assert n_splits == None or len_splits == None
if len_splits == None:
len_splits = ceil(len(iterable)/n_splits)
splits = []
for i in range(0,len(a),len_splits):
splits.append([iterable[i+j] for j in range(len_splits) if i+j<len(iterable)])
return splits
a = range(10)
for sub_a in split_iterable(a,len_splits=3):
print(" split :")
#here i can run some extra stuff before proceeding with the next split
for i in sub_a :
print(i)
输出:
split :
0
1
2
split :
3
4
5
split :
6
7
8
split :
9
编辑:看起来我似乎不够努力,itertools
doc page实际上有一个秘诀:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)