2016-01-24 47 views
0

我有35个项目分为3页。第1页和第2页有15个项目,第3页有5个。现在我已经创建了循环来告诉脚本要去哪里。这是脚本。遍历双值产生页码

for i in range(1,36): 
    if i <= 15: 
     page = 1 
     item = i 
    if i > 15 <= 30: 
     page = 2 
     item = i - 15 
    if i > 30 <= 35: 
     page = 3 
     item = i - 30 

    print 'GOTO page %s take item %s' % (page, item) 

但是将来可能会有1000页的页面上有25个项目。所以我正在改变脚本如下。但现在我需要添加更多if陈述,如if i > items_per_page * 22 <= items_per_page * 23:什么是更好更Python的方式来获得相同的?

max_items = 35 
items_per_page = 15 

for i in range(1, max_items + 1): 
    if i <= items_per_page: 
     page = 1 
     item = i 
    if i > items_per_page <= items_per_page * 2: 
     page = 2 
     item = i - items_per_page 
    if i > items_per_page * 2 <= items_per_page * 3: 
     page = 3 
     item = i - items_per_page * 2 

    print 'GOTO page %s take item %s' % (page, item) 
+0

注意:您的条件很奇怪。你可以使用'elif's并避免重复相同的比较:'if i <= x:... elif i <= 2 * x:... elif i <= 3 * x'。此外,确保链比较的作品,但他们看起来很熟悉时最好使用。我会说,形式'a> b Bakuriu

回答

3

你可以只使用数学:

def page_number(item, items_per_page): 
    # 1-based numbering assumed; first item is 1, first page is 1 
    return (item - 1) // items_per_page + 1 

每页15个项目,这正确地指出,第31项是第3页:

>>> page_number(30, 15) 
2 
>>> page_number(31, 15) 
3 

和规模一路对于每个25个项目的情况,第1000页:

>>> page_number(25005, 25) 
1001 

只需使用你的循环:

for i in range(1, max_items + 1): 
    page = page_number(i, items_per_page) 
    item = i - (page - 1) * items_per_page 
    print 'GOTO page %s take item %s' % (page, item) 

无需if语句。

一般来说,如果if语句的数量取决于循环的项目数,那么您就错误地去了解它。

+0

你是国王!非常感谢你! – Goran

0
page = ((i-1) // items_per_page) + 1 
item = ((i-1) % items_per_page) + 1 
+0

对Python 3使用'''',否则你会得到浮动对象。您可以使用'divmod()'函数来计算*余数和商。 –

+0

这个问题有一个python2.7标记,但感谢提示..不知道python有divmod – cozyconemotel

+0

是的,但''''也可以在Python 2中工作,你仍然可以使用'from __future__ import true_division'来获取2中相同的分工行为。 –