TypeError:' int'对象不可订阅{Python}

时间:2017-06-11 19:39:08

标签: python math

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]

错误接缝在这里。与&#39; int&#39;对象不是可下标的,如果将我的列表中的每个数字转换为浮动可以修复它但是接缝不起作用,那么浮动线是我测试的

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

2 个答案:

答案 0 :(得分:1)

首先要做的事情......没有理由在这里使用eval有一个更简单的方法:

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

将是:

while not bovengrenspriem.isdigit()

至于错误消息....您正在尝试索引

中的int
x[t]

答案 1 :(得分:0)

问题似乎在:

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

x [t]期望x是列表/数组等,x被定义为2(一个int),所以int不是可订阅的。

另外(除了真正的问题,你可以做一些简单的改进):

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

计数器总是增加,所以你可以写:

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

counter +=1

您可以更改

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

while lliste[-1] <= bovengrenspriem:

用英语写评论(但我来自荷兰,所以我理解荷兰语。)

尝试使用好的命名变量并清除大写字母。 lliste可能是一个列表,但是第一个和最后一个是什么? lListE会更清楚,但更好的是像primeListEnd(?)或更合适的东西。

更改

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

类似于:

bovengrenspriem = None

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

这将保存第一个重复原始行的副本。

然而,更好的是使用单独的布尔

upperBoundaryPrimeValid = False

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