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 循环示例,只是为了显示在 while
和 for
(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:列表索引必须是整数或切片,而不是字典”