0

I have a long list I would like to break into shorter lists. I am using a list comprehension but it seems a bit long and inelegant. Is there a better way?

# z is a list
z = range(99)

##  zz should slice z into short lists with three members
##  using list comprehension I get this
zz = [ z[i : i+3] for i,x in enumerate(z) if i%3 == 0 ]

# seems a bit verbose. is there a cleaner way?
zach
  • 29,475
  • 16
  • 67
  • 88

1 Answers1

1

From itertools (it's one of the common recipes):

import itertools

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

Example:

>>> list(grouper(range(100), 3))
[(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), (84, 85, 86), (87, 88, 89), (90, 91, 92), (93, 94, 95), (96, 97, 98), (99, None, None)]
Simeon Visser
  • 118,920
  • 18
  • 185
  • 180