首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何表示范围的动态列表?

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

Stack Overflow用户
提问于 2014-07-19 23:49:14
回答 3查看 499关注 0票数 3

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

代码语言:javascript
运行
复制
1, 3, 4-7, 9-

在一个12页的文档中,这个文件会打印页面。

代码语言:javascript
运行
复制
1, 3, 4, 5, 6, 7, 9, 10, 11, 12

我如何用Python来表示这样的结构,以便能够询问特定的“页码”(这不限于打印;这是一个例子)是否在范围内,并在范围内循环?

如果它们在一个扁平的列表中(就像第二个示例中的那样),这些事情会很容易(并且将其转换为该列表的字符串处理将是微不足道的),但是开放的范围带来了一个问题。它必须在最后一刻才能被夷为平地。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-20 00:30:26

我会用发电机:

代码语言:javascript
运行
复制
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))

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

代码语言:javascript
运行
复制
for page in parse_ranges('1, 3, 4-7, 9-'):
    if page > 20:
        break

    print(page)

或者单独这样做:

代码语言:javascript
运行
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2014-07-20 00:00:12

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-07-20 00:43:51

原谅我使用元组列表作为页面的粗野尝试。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24846049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档