从一个范围中获取n个数字,包括x

2024-05-01 21:46:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python创建分页系统。我有一个给定的页面范围[1。。。n] 并希望从中精确提取m个数字,包括当前页码。如果可能,当前页码必须在中间。有什么优雅的方法吗?你知道吗

我知道这可以用很少的if…else语句来完成,但是这看起来非常笨拙。你知道吗

def generate_short_page_range(current_page, page_range, shown_pages_number):
    pages_on_one_side = int((shown_pages_number - 1) / 2)
    short_page_range = range(current_page - pages_on_one_side, current_page + pages_on_one_side + 1)

    # creating common part of page ranges
    short_page_range = [item for item in short_page_range if item in page_range]

    return short_page_range

对于数据:当前页面=1,页面范围大小=7,显示页面数=7,我想返回[1,2,3,4,5,6,7],现在它返回[1,2,3,4]

编辑: 假设我有一个20页的列表,它给出了如下的页面范围:[1,2。。。19, 20]. 我想限制分页器的大小,例如5页,所以当我们在第12页时,它会显示[10,11,12,13,14]。但是我也希望它总是显示正好5页,所以当当前页面左边只有一页时,我希望它在右边显示另外一页。所以当我们在第2页时,我想返回[1,2,3,4,5],而不是从当前函数得到的[1,2,3,4]。与第一页相同,我希望返回[1,2,3,4,5],而不是[1,2,3]


Tags: innumberifonpagerange页面pages
1条回答
网友
1楼 · 发布于 2024-05-01 21:46:45

我的解决方案也使用if-else,我认为这是最直接的方法:

def generate_short_page_range(current_page, page_range, shown_pages_number):

    page_per_side = shown_pages_number // 2
    current_page_index = page_range.index(current_page)

    # First, check if the current_page is at the edges
    if current_page in page_range[page_per_side:-page_per_side]:
        return page_range[current_page_index - page_per_side : current_page_index + page_per_side + shown_pages_number%2]

    # If it is at the front, return the firstfew pages (len = shown_pages_number)
    elif current_page_index < len(page_range) // 2:
        return page_range[:shown_pages_number]

    # If it is at the end, return the last few pages (len = shown_pages_number)
    else:
        return page_range[-shown_pages_number:]

运行一个简单的测试:

# test 
page_range = [num for num in range(22,30)]
shown_pages_number = 5

for page in page_range:
    print(f'Page {page}:')
    print(generate_short_page_range(page, page_range, shown_pages_number))

输出:

Page 22:
[22, 23, 24, 25, 26]
Page 23:
[22, 23, 24, 25, 26]
Page 24:
[22, 23, 24, 25, 26]
Page 25:
[23, 24, 25, 26, 27]
Page 26:
[24, 25, 26, 27, 28]
Page 27:
[25, 26, 27, 28, 29]
Page 28:
[25, 26, 27, 28, 29]
Page 29:
[25, 26, 27, 28, 29]

相关问题 更多 >