dornad
dornad

Reputation: 1294

Algorithm for Iterating thru a list using pagination?

I am trying to come up with an algorithm to iterate thru a list via pagination.

I'm only interested in the initial index and the size of the "page".

For example if my list is 100 items long, and the page length is 10:

1st page:  starts at 0, length 10
2nd page:  starts at 11, length 10
3rd page:  starts at 21, length 10
...
Nth page:  starts at 90, length 10

My problem is coming up with an elegant solution that satisfies these cases:

1. list has 9 elements, page length is 10

       1st page:  starts at 0, length 9

2. list has 84 elements, page length is 10

      1st page:  starts at 0, length 10
      2nd page:  starts at 11, length 10
      3rd page:  starts at 21, length 10
      ...
      Nth page:  starts at 80, length 4

I could do this with a bunch of conditionals and the modulo operation, but I was wondering if anyone could offer a better/elegant approach to this problem.

Thanks!

Upvotes: 0

Views: 252

Answers (1)

Paddy3118
Paddy3118

Reputation: 4772

There follows some code doing it the long way in Python which could be used for other languages too; followed by how it could be done in a more maintainable fashion by the intermediate Pythoneer:

>>> from pprint import pprint as pp
>>> n, perpage = 84, 10
>>> mylist = list(range(n))
>>> mylist[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> mylist[-10:] # last ten items
[74, 75, 76, 77, 78, 79, 80, 81, 82, 83]
>>> sublists = []
>>> for i in range(n):
    pagenum, offset = divmod(i, perpage)
    if offset == 0:
        # first in new page so create another sublist
        sublists.append([])
    # add item to end of last sublist
    sublists[pagenum].append(i)


>>> pp(sublists)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
 [20, 21, 22, 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, 48, 49],
 [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
 [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
 [80, 81, 82, 83]]
>>> # Alternatively
>>> sublists2 = [mylist[i:i+perpage] for i in range(0, n, perpage)]
>>> pp(sublists2)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
 [20, 21, 22, 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, 48, 49],
 [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
 [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
 [80, 81, 82, 83]]
>>> 

Upvotes: 1

Related Questions