gpt4 book ai didi

带有约束的 Python 列表分块或分页

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:19 24 4
gpt4 key购买 nike

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

变化:由于它是分页,我们如何在每次调用时生成一页/ block 。或者换句话说,假设我有一个名为 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]]

最佳答案

为偶数创建一个生成器,然后分块:

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

您可以通过仅在最后一个 block (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这确保最短的 block 附加 None 而不是 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]]

关于带有约束的 Python 列表分块或分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44656213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com