s = [1,2,3,4,5,6,7,8,9] n = 3 list(zip(*[iter(s)]*n)) # returns [(1,2,3),(4,5,6),(7,8,9)] How does zip(*[iter(s)]*n) work? What would it look like if it was written with more verbose code? This is a technique used for splitting a list into chunks of equal size - see that question for a general overview of the problem.