my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
如何使用约束对此列表进行分块/分页?让我说我的页面大小是3,每页我只想要被2整除的数字。
chunks = [[2,4,6],[8,10,12],[14]]
的变化: 由于它是分页,我们如何每次调用生成一个页面/块。换句话说,我说我有一个名为paginate的函数
def paginate(my_list, row_len, page_number=1):
其中page_number是您请求的页面,例如:page_number = 2。特殊情况:如果要获取所有页面,请设置page_number = 0
可以调用此函数,如下所示:
paginate(my_list, 3, 2) # [8,10,12]
paginate(my_list, 3, 0) # [[2,4,6],[8,10,12],[14]]
答案 0 :(得分:1)
为偶数创建生成器,然后为 chunk 创建生成器:
# Python 2
gen = (x for x in my_list if x%2==0)
chunks = [[i for i in t if i is not None] for t in map(None, *(gen,)*3)]
print chunks
# [[2, 4, 6], [8, 10, 12], [14]]
您可以通过仅对最后一个块进行检查和替换来避免迭代整个过滤None
,这是None
的唯一可能位置:
gen = (x for x in my_list if x%2==0)
chunks = map(None, *(gen,)*3)
if None in chunks[-1]:
chunks[-1] = filter(None, chunks[-1])
print(chunks)
# [(2, 4, 6), (8, 10, 12), (14,)]
在Python 3中,map(None, ...)
可以替换为itertools.zip_longest
,这可以确保最短的块附加None
s而不是zip
,而from itertools import zip_longest
gen = (x for x in my_list if x%2==0)
chunks = [[i for i in t if i is not None] for t in zip_longest(*(gen,)*3)]
print(chunks)
# [[2, 4, 6], [8, 10, 12], [14]]
只是停留在最短的可迭代:
{{1}}
答案 1 :(得分:0)
让我们使用名为more-itertools
import more_itertools
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
temp = [num for num in my_list if num % 2 == 0]
list(more_itertools.chunked(temp, 3))
[[2, 4, 6], [8, 10, 12], [14]]