Python:将列表分割成定义大小的块并填充剩余部分
我想把我的列表分成每行都有相同列数的形式,我在寻找最好的(最优雅/符合Python风格的)方法来实现这个目标:
>>> split.split_size([1,2,3], 5, 0)
[[1, 2, 3, 0, 0]]
>>> split.split_size([1,2,3,4,5], 5, 0)
[[1, 2, 3, 4, 5]]
>>> split.split_size([1,2,3,4,5,6], 5, 0)
[[1, 2, 3, 4, 5], [6, 0, 0, 0, 0]]
>>> split.split_size([1,2,3,4,5,6,7], 5, 0)
[[1, 2, 3, 4, 5], [6, 7, 0, 0, 0]]
这是我目前想到的方案:
def split_size(l, size, fillup):
"""
splits list into chunks of defined size, fills up last chunk with fillup if below size
"""
# len(l) % size or size
# does i.e. size=5: 3->2, 4->1, 5->0
stack = l + [fillup] * (size - (len(l) % size or size))
result = []
while len(stack) > 0:
result.append(stack[:5])
del stack[:5]
return result
我相信一定有更聪明的解决办法。特别是在“逆模”这一部分: len(l) % size 或 size 这里一定有更易读的写法,对吧?
1 个回答
6
这个叫做 itertools recipe 的grouper功能正是你想要的:
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)