如何表示范围的动态列表?

2024-05-19 01:35:39 发布

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

例如,从文档打印页面时,可以使用以下速记符号指定要打印的特定页码:

1, 3, 4-7, 9-

在一个12页的文档中,这将打印页面

^{pr2}$

如何在Python中表示这样的结构,以便查询特定的“页码”(这不仅限于打印;这是一个示例)是否在范围内并在该范围内循环?在

如果它们像第二个例子一样在一个扁平化的列表中,那么这些事情就很容易了(而将其转换为字符串的处理也很简单),但是开放的范围带来了一个问题。直到最后一分钟才可以把它压平。在


Tags: 字符串文档示例列表符号页面事情结构
3条回答

请原谅我用元组列表作为页面的愚蠢尝试

pages=[(1,1),(3,3),(4,7),(8,)]

def find_page(pages,page):
    for p in pages:
        if len(p)==1:
            if page >= p[0]:
                return True
            else:
                break
        if p[0]==p[1]:
            if page==p[0]:
                return True
        elif page >= p[0] and page <= p[1]:
            return True

我会用发电机:

import itertools

def parse_ranges(ranges):
    for chunk in ranges.split(', '):
        if '-' not in chunk:
            chunk = chunk + '-' + chunk  # Turns 7 into 7-7 

        start, end = chunk.split('-')

        if end:
            yield from range(int(start), int(end) + 1)
        else:
            yield from itertools.count(int(start))

迭代时,可以强制执行最大页码:

^{pr2}$

或者分开做:

def cap(iterable, maximum):
    for n in iterable:
        if n > maximum:
            break

        yield n

pages = list(cap(parse_ranges('1, 3, 4-7, 9-'), 20))

如果我正确地理解了您的问题,您可以使用元组列表。(1,1)表示第1页,(4, 7)表示第4、5、6和7页。棘手的部分是表示“从这一页到最后”。但是,如果您可以访问页数,可以使用float("inf")来解决这个问题。然后展平函数如下所示:

def flatten_ranges(ranges, number_of_pages):
    flattened_list = []
    for item in ranges:
        page = item[0]
        while page <= item[1] and page <= number_of_pages:
            flattened_list.append(page)
            page += 1
    return flattened_list

相关问题 更多 >

    热门问题