Hendrik
Hendrik

Reputation: 47

TypeError: 'int' object is not subscriptable {Python}

from math import log

lliste = [2]
bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break
counter = 2
x = 2
while lliste[-1] < bovengrenspriem or lliste[-1]== bovengrenspriem:
    liste = []
    for i in range (1,counter+1):
        if counter % i == 0:
            liste.append(i)
    if len(liste) == 2:
        lliste.append(counter)
        counter += 1
    else:
        counter +=1

lliste[:]= [float(p)for p in lliste]       
lliste[:]= [log(x[t]) for t in lliste]

The mistake seams to be here. with 'int' object is not subscriptable, the float line is me testing out if converting every number in my list to float could fix it but it seams not to work

 a = sum (lliste)
    result = a/bovengrenspriem
    print (result)

Upvotes: 2

Views: 2451

Answers (2)

Michel Keijzers
Michel Keijzers

Reputation: 15357

The problem seems to be in:

lliste[:]= [log(x[t]) for t in lliste]

x[t] expects that x is a list/array etc, and x is defined as 2 (an int), So an int is not subscriptable.

Also (except for the real problem, there are some easy improvements you can make):

in

if len(liste) == 2:
    lliste.append(counter)
    counter += 1
else:
    counter +=1

The counter is always increased, so you can write:

if len(liste) == 2:
    lliste.append(counter)

counter +=1

You can change

while lliste[-1] < bovengrenspriem or lliste[-1]== bovengrenspriem:

into

while lliste[-1] <= bovengrenspriem:

Write comments in English (however I'm from the Netherlands, so I understand Dutch).

Try to use good named variables and clear capitalization. lliste is probably a list, but what is the first l and last e? lListE would be more clear, but better would be something like primeListEnd (?) or something more approriate.

Change

bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break

Into something like:

bovengrenspriem = None

while not type(bovengrenspriem) == int:
    ...

This saves the copy of the first duplicate original line.

However, even better is to use a separate boolean

upperBoundaryPrimeValid = False

while !upperBoundaryPrimeValid:
   ..
   if valid ... (pseudo code)
       upperBoundaryPrimeValid = True;

Upvotes: 0

Pythonista
Pythonista

Reputation: 11615

First things first... no reason to use eval here there is a much simpler way to do this:

bovengrenspriem = eval(input('geef een getal van die je weten wil welke priemgetal het is? ',))

while not type(bovengrenspriem) == int:
    bovengrenspriem = eval(input('Foute invoer, geef een getal van die je weten wil welke priemgetal het is? ',))
    if type(bovengrenspriem) == int:
        break

which would be:

while not bovengrenspriem.isdigit()

As for the error message.... You are trying to index an int in

x[t]

Upvotes: 2

Related Questions