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

爷,独闯天下 提交于 2020-01-30 06:34:24

问题


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)

回答1:


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]



回答2:


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;


来源:https://stackoverflow.com/questions/44487987/typeerror-int-object-is-not-subscriptable-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!