TypeError:列表索引必须是整数或切片,而不是浮点数

Posted

技术标签:

【中文标题】TypeError:列表索引必须是整数或切片,而不是浮点数【英文标题】:TypeError: list indices must be integers or slices, not float 【发布时间】:2019-03-03 12:27:52 【问题描述】:
def convBin():
    cont = []
    rest = []
    dev = []
    decimal = []

    print("Ingrese el valor a convertir: ")
    valor = ast.literal_eval(input())

    if isinstance(valor, int):
        while valor > 0:
                z = valor // 2
            resto = valor%2
            valor = valor // 2
            cont.append(z)
            rest.append(resto)

        cont.reverse()
        rest.reverse()

        dev.append(cont[0])

        x = 0
        while x <= (len(rest) - 1):
            dev.append(rest[x])
            x += 1

        print(" ")
        print("Lista de devoluciones: ")
        print(dev)
        print("")

    elif isinstance(valor, float):
        a = valor // 1
        b = valor % 1

        while a > 0:
            z = a // 2
            resto = a%2
            a = a // 2
            cont.append(z)
            rest.append(resto)

        cont.reverse()
        rest.pop()

        dev.append(cont[1])

        for i in rest:
            dev.append(rest[i])

        print("Inserte el número de error minimo")
        num = input()

        while num > 0:
            dec = b * 1
            dec2 = dec//1
            dec %= 1        
            decimal.append(dec2)


        print("Parte entera: ")
        print(dev)
        print("Parte decimal:")
        print(num)

    else:
        print("Ha aparecido un error")

它向我显示了一个错误,我无法将浮点数附加到列表中。

在询问您一个数字后,它会控制它是哪种类型的数字。当它是一个int时,它没有任何问题。但是当它是一个浮点数时,它表示它不能将一个浮点数添加到一个列表中,它保存了之前进行的操作的数量。

有人可以向我解释为什么我不能将浮点数附加到列表中,或者我该如何解决这个问题?

Traceback(最近一次调用最后一次):文件“Converter.py”,第 169 行,在 转换宾(); convBin 中的文件“Converter.py”,第 53 行 dev.append(rest[i]) TypeError: 列表索引必须是整数或 切片,不浮动

谢谢。

【问题讨论】:

你的意见是什么? valor = ast.literal_eval(input()) 输入了什么? 18? 18.? 18.89? 你想用这个循环来完成什么? for i in rest: dev.append(rest[i]) 您是否尝试将 rest 中的每个项目附加到 dev 的末尾? rest 包含您的 resto 计算结果,当 valor 是浮点数时将是浮点数。 some_float % 2 是一个浮点数。 在输入中你可以输入你想要的任何东西,如果它是 int 代码将执行第一个 if,但如果它是 float 将执行另一件事。 【参考方案1】:

for i in rest 将为您提供列表中的实际项目,而不是索引。从您的代码中,您似乎想要附加该值。但实际上,您再次将值视为索引,并尝试从数组中获取它。

for i in rest:
            dev.append(rest[i])

修复:

只需将上面改为:

dev.extend(rest)

但是这段代码从 rest 中获取一个值,然后再次使用该值作为索引,如果该值 i 原来是 float,则会引发异常。

你没有提到哪一行给你这个错误。但我想一定是这个。它可能会产生许多其他意外错误,例如 array out of bound

这是我得到的错误,如果我为 valor = 18.5 运行您的代码

https://ideone.com/HGagLb

Traceback(最近一次调用最后一次):文件“./prog.py”,第 71 行,在 文件“./prog.py”,第 51 行,在 convBin TypeError: list 索引必须是整数或切片,而不是浮点数

上面的例子和下面的例子之间的区别(来自你的代码,你处理int):

x = 0
while x <= (len(rest) - 1):
    dev.append(rest[x])
    x += 1

是不是,在第一种情况下,i 实际上是列表 rest 中的项目(int 或 float),而在后一种情况下,它是一个有效的索引。

【讨论】:

while 循环不好。 for i in range(len(rest)):dev.append(rest[i]) 更好但不是惯用的。 for i in rest:dev.append(i) 是惯用的 Python。但有更好的方法:dev.extend(rest). 我说的是“elif”,就是这部分代码:while x > 0: z = x // 16 resto = x%16 x = x // 16 cont.append (z) rest.append(resto) @StevenRumbalski:我从 OP 的代码中复制了 while 循环示例,只是为了显示在 whilefor(each) 循环中处理索引的区别。显然,dev.extend(rest) 是最好的方法。 @Lunargenta:你的意思是你在这部分得到了提到的异常? while x > 0: z = x // 16 resto = x%16 x = x // 16 cont.append(z) rest.append(resto) 这很奇怪。因为我看不出该代码有什么问题。 (但是,第 51 行肯定会给出您提到的错误)ideone.com/HGagLb(在这里查看)顺便说一句,您使用的是 python 2 还是 python 3? Python 3. 尝试将浮点数附加到列表中时会跳转错误。

以上是关于TypeError:列表索引必须是整数或切片,而不是浮点数的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:列表索引必须是整数或切片,而不是 str

TypeError:列表索引必须是整数或切片,而不是尝试制作二维列表时的元组

Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str

在调用列表中的字典中的值时收到“TypeError:列表索引必须是整数或切片,而不是字典”

TypeError:列表索引必须是整数或切片,而不是解析json请求时的str

Spyder-TypeError中的双向重复测量ANOVA:列表索引必须是整数或切片,而不是numpy.float64