Python列表分块或限制分页

时间:2017-06-20 14:43:42

标签: python pagination

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]]

2 个答案:

答案 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]]

这是link for more-itertools