0

So say if I have a list of 43 items and I want to split that list up. The result would be 5 lists with the first 4 having 10 items and the last having 3 items.

Is there a way I can do this?

Aspect11
  • 318
  • 1
  • 3
  • 10
  • 2
    Does this answer your question? [How do you split a list into evenly sized chunks?](https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks) – Lukas Schmid Mar 07 '21 at 14:16
  • That one splits the list into even sized chunks, but I want it so that each list is a set amount and then the last list can be just the remaining amount. – Aspect11 Mar 07 '21 at 14:21

2 Answers2

1

Python has a feature such that if you ask for the first 10 elements of a list with only 3 elements, it returns all 3 elements instead of causing an error.
Formally, if a is a list with 3 elements, a[0:100] returns all 3 elements. We can use that here like so:

a = [i for i in range(1, 44] # A list of 43 items from 1 to 43

from math import ceil
for i in range(ceil(len(a)/10)):
    print(a[i*10:i*10+10])

And the output is:

[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]

In the last iteration of the loop, we print a[4*10:4*10 + 10], that is a[40:50], which returns everything from a[40] to the end of a.


Bonus:

If you want to store the separate lists in another array, you can do this:

new_array = []
for i in range(ceil(len(a)/10)):
    new_array.append(a[i*10:i*10+10])

And new_array will store the 5 lists.

Robo Mop
  • 3,485
  • 1
  • 10
  • 23
1

You can use steps in the range to get exactly the start position of the subscript based on the size of the repeating chunks:

L     = list(range(43))
parts = 5              # if you're looking for a fixed number of parts

size  = len(L)//parts  # 10 (don't need parts if you know the chunk size)
R     = [L[p:p+size] for p in range(0,len(L),size)]

print(R)

[[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]]
Alain T.
  • 40,517
  • 4
  • 31
  • 51