2010-11-22 20 views
2

一部の印刷ダイアログでは、印刷するページ(およびページ範囲)を指定するオプションがあります。印刷アルゴリズムのページ範囲

1-10, 3, 4, 23-47 

これにはすでにレシピ/アルゴリズムがありますか?

+0

Algorthims?より具体的にしてください。 – delnan

+2

アルゴリズムまたは関数/ライブラリ?これを解析するのは簡単ではないようです。 ( '、'で分割した文字列)、 ' - 'で再び分割し、* int(x)*を使用して文字列をintに変換します。すべてのページをセットに追加します。範囲を拡張します。セットからリストを作成してソートします。 –

答えて

5
def parse_range(astr): 
    result=set() 
    for part in astr.split(','): 
     x=part.split('-') 
     result.update(range(int(x[0]),int(x[-1])+1)) 
    return sorted(result) 

print(parse_range('1-10, 3, 4, 23-47')) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47] 
+1

これは非常にうまくいっています。私は特に、x [0]とx [-1]を使って単一の値または範囲を扱うのが好きです。 – kindall

+1

'result = result.union(...)'の代わりに 'result.update(...)'を使用します。 –

+0

ありがとう@スヴェンマルナッハ、それは良いです。 – unutbu

-1

これはお探しですか?

outer= text.split(",") 
dashes= [ x.partition('-') for x in outer ] 
ranges= [ (x,z) if y == '-' else (x,x) for x,y,z in dashes ] 
[ (int(x),int(y)) for x,y in ranges ] 
2

それは数年後だが、私はPageRangeオブジェクトを提供Pythonパッケージを作りました。それは、https://github.com/taylorzr/PageRangeでgithubの上だし、https://pypi.python.org/pypi/PageRange/では、PyPI上:

pip install PageRange 

使用法:何のため

from pagerange import PageRange 

page_range = PageRange("1-10, 3, 4, 23-47") #-> PageRange("1-10,23-47") 
page_range.range #-> "1-10,23-47" 
page_range.pages #-> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47] 

page_range.add_page(48) 
page_range.range #-> "1-10,23-47"