例如,在从文档打印页面时,可以使用以下速记符号指定要打印的特定页码:
1, 3, 4-7, 9-
在一个12页的文档中,这个文件会打印页面。
1, 3, 4, 5, 6, 7, 9, 10, 11, 12
我如何用Python来表示这样的结构,以便能够询问特定的“页码”(这不限于打印;这是一个例子)是否在范围内,并在范围内循环?
如果它们在一个扁平的列表中(就像第二个示例中的那样),这些事情会很容易(并且将其转换为该列表的字符串处理将是微不足道的),但是开放的范围带来了一个问题。它必须在最后一刻才能被夷为平地。
发布于 2014-07-20 00:30:26
我会用发电机:
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))
当您迭代最大页码时,可以强制执行它:
for page in parse_ranges('1, 3, 4-7, 9-'):
if page > 20:
break
print(page)
或者单独这样做:
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))
发布于 2014-07-20 00:00:12
如果我正确理解你的问题,你可以用一个元组列表。(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
发布于 2014-07-20 00:43:51
原谅我使用元组列表作为页面的粗野尝试。
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
https://stackoverflow.com/questions/24846049
复制相似问题