Python -> TypeError:列表索引必须是整数,而不是 str

Posted

技术标签:

【中文标题】Python -> TypeError:列表索引必须是整数,而不是 str【英文标题】:Python -> TypeError: list indices must be integers, not str 【发布时间】:2018-08-09 08:39:25 【问题描述】:

我在 python 中有一个列表/数组 str4,我想用一个我坚信是 int 的变量来访问它,因为我用函数 isdigit() 对其进行了测试strong> 并且我还进行了手动调试并检查了所有选项是否正确显示唯一的数字。

temp = "variableX"
file2 = open('file.txt','r')
for line in file2:
  if line.find(temp) =! -1:
    posArray = line.split(temp)[1][1:3]
    if ")" in posArray:
      posArray = posArray[:-1]
    if posArray.isdigit():
      num = posArray
      print temp+"("+num+")"
      print num
      print str4[num]

上面的代码是用来调试的,我的问题在str4[num],上面代码的结果是:

variableX(1)
1
"this is position 1"
Traceback (most recent call last):
  File "orderList.py", line34, in <module>
    print str4[num]
TypeError: list indices must be integers, not str

为什么 num 是一个数字,但 python 告诉我它是一个字符串? 我做错了什么?

【问题讨论】:

你刚刚打开文件,你从来没有读过它 '2'2 不是一回事。它们都是数字,但第一个是string,第二个是integerline 默认是 string,因为它是从文件中读取的。 num 最终成为 line 的一部分,所以它也是 string 在第 34 行之前使用 int(num) 将 num 转换为整数 【参考方案1】:

另一种解决方案是在

之后
num = posArray

做:

print str4[int(num)])

【讨论】:

【参考方案2】:

解释器永远不会出错...

更严重的是,你得到 num 作为子字符串,所以它是一个字符串。如果要将其用作字符串索引,则必须将其转换为 int:

  num = int(posArray)          # ok num is now an int
  print temp+"("+str(num)+")"  # must use str to concat it with strings
  print num, type(num), posArray, type(posArray) # num is int, posArray is string
  print str4[num]              # now fine

【讨论】:

【参考方案3】:

在下面使用我的 cmets 查看您的代码。从下往上阅读,了解如何轻松调试自己的代码;思考过程是什么。

temp = "variableX"
file2 = open('file.txt','r')  # which is a file, so `line` is `string` - CASE CLOSED
for line in file2:  # and `line` is a result of looping through `file2`
  if line.find(temp) =! -1:
    posArray = line.split(temp)[1][1:3]  # and `posArray` is a part of `line`
    if ")" in posArray:
      posArray = posArray[:-1]  # ok, `posArray` is a part of `posArray`
    if posArray.isdigit():  # `posArray` contains digits only but that doesn't help really, so does "123"..
      num = posArray  # ok, so `num` is whatever `posArray` is
      print temp+"("+num+")"
      print num
      print str4[num]  # here is the Error so we start here and work backwards

我们在上面展示的是,最终,num 将与 line (str) 属于同一类型,因此不能用于 index 任何东西。必须先通过int(num) 将其转换为int

【讨论】:

【参考方案4】:

您检查了字符串 posArray 是否为数字:

  if posArray.isdigit():
      num = posArray

但是你没有把它转换成数字,像这样:

  if posArray.isdigit():
      num = int(posArray)

【讨论】:

正是我所说的:)

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

Python TypeError 遍历列表

Python 酸洗错误:TypeError:对象泡菜未返回列表。 numpy的问题?

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

Python/Pandas TypeError:“列表”对象不可调用

TypeError:在使用 Python 进行网络抓取时,只能将 str(而不是“列表”)连接到 str 错误

Python 2 - TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“列表”