python-3.xlistfor-loopdivisionchinese-remainder-theorem

Can't for loop through a whole list in python


I'm trying to code in python to filter a list of the first n integers that when divided have a remainder of 1. However, it looks like it's not checking every integer in my list according to the print statements I have. I have no idea why. I'm just starting to learn code, so please be patient with me. I suspect its something obvious I'm not seeing.

Below is my code I have so far:

def main():
    checkUpTo = 20
    listOfInts = list(range(checkUpTo))
    filterList = [3]
    boolList = []
    
    for d in filterList:
        print("checking list: " + str(listOfInts) + " for rem=1 when divided by " + str(d))
        for x in listOfInts:
            print("checking: " + str(x))
            isDivisible = checkIfDivisible(x,d)
            if isDivisible==False:
                listOfInts.remove(x)
        print("got list: " + str(listOfInts))

    print(listOfInts)

def checkIfDivisible(number,divisor):
    remainder = number % divisor
    print(str(number) + "%" + str(divisor) + "=" + str(remainder))
    if number % divisor == 1:
        return True
    if number % divisor != 1:
        return False

if __name__ == "__main__":
    main()

Thanks for the help

edit: my output:

checking list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] for rem=1 when divided by 3
checking: 0
0%3=0
checking: 2
2%3=2
checking: 4
4%3=1
checking: 5
5%3=2
checking: 7
7%3=1
checking: 8
8%3=2
checking: 10
10%3=1
checking: 11
11%3=2
checking: 13
13%3=1
checking: 14
14%3=2
checking: 16
16%3=1
checking: 17
17%3=2
checking: 19
19%3=1
got list: [1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19]
[1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19]

not sure why it's not checking 1,3, etc.


Solution

  • Look at For loop, listOfInts.remove(x) removes element from list. Therefore, your list dose not have those element whose remainder is one.

     for x in listOfInts:
            print("checking: " + str(x))
            isDivisible = checkIfDivisible(x, d)
            if isDivisible == False:
                 listOfInts.remove(x)
    

    Lets understand what is hapening in for loop,