I got a list with 958 elements.
myList = [1, 2, 3, 4, ..., 958]
I want to take first 100 elements, then next 100 (from 100 to 200) and so on.
What I have tried:
sum = 0
ct = 0
for i in range(len(myList):
sum = sum myList[i]
ct = ct 1
if ct == 100:
ct = 0
print(sum)
sum = 0
It works good until the 900th element. Then it cannot do the sum of the last 58 elements of myList because the ct will not get 100.
Any ideas?
CodePudding user response:
Step through the list 100 at a time and sum the slice. Slicing beyond the end of a list is handled correctly:
myList = list(range(1,959))
for i in range(0,len(myList),100):
sub = myList[i:i 100]
print(f'sum of {sub[0]}..{sub[-1]} is {sum(sub)}')
Output:
sum of 1..100 is 5050
sum of 101..200 is 15050
sum of 201..300 is 25050
sum of 301..400 is 35050
sum of 401..500 is 45050
sum of 501..600 is 55050
sum of 601..700 is 65050
sum of 701..800 is 75050
sum of 801..900 is 85050
sum of 901..958 is 53911
CodePudding user response:
Since you only print the sum when you get to a multiple of 100, you never print the sum of the last group of elements, since it's not 100 elements. To get the last group, print the sum after the loop ends.
You can also use enumerate()
to get an index directly in the loop, rather than incrementing your own ct
variable.
total = 0
for i, item in enumerate(myList, 1):
total = item
if i % 100 == 0:
print(total)
total = 0
# Print the final group
if i % 100 != 0:
print(total)
I also renamed the sum
variable to total
, because sum
is the name of a built-in function.
CodePudding user response:
From the itertools
module's documentation:
from itertools import zip_longest
def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
"Collect data into non-overlapping fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
# grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
# grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
args = [iter(iterable)] * n
if incomplete == 'fill':
return zip_longest(*args, fillvalue=fillvalue)
if incomplete == 'strict':
return zip(*args, strict=True)
if incomplete == 'ignore':
return zip(*args)
else:
raise ValueError('Expected fill, strict, or ignore')
for century in grouper(myList, 100, fillvalue=0):
print(sum(century))
CodePudding user response:
You can just slice the list as follows:
for k in range(0, len(mylist), 100):
print(sum(mylist[k:k 100]))
This will print the sum of elements in groups of 100. If the list length is not an exact multiple of 100, the last sum will be that of the remaining elements
CodePudding user response:
Try the following:
index = 1
slicesize = 100
start = 0
end = 100
myList = range(1, 958)
while True:
myslice = myList[start:end]
index = 1
start = end
end = index * slicesize
if start > len(myList):
break
CodePudding user response:
I believe that this should do the trick.
import random
# generate list with N elements, each of which is a random integer in [0, 99]
N = 57
random.seed()
myList = [random.randint(0, 99) for i in range(0, N)]
# Calculate total number of prints before there will be less than num_elem
# elements remaining in the list.
num_elem = 10
total_prints = len(myList) // num_elem
for i in range(0, total_prints):
index = i * num_elem
print(sum(myList[index:index num_elem]))
# if there are remaining elements, print their sum
if (len(myList) % num_elem) != 0:
print(sum(myList[index num_elem:]))