【问题标题】:how to solve type error: "list indices must be integers or slices, not str"如何解决类型错误:“列表索引必须是整数或切片,而不是 str”
【发布时间】:2019-12-26 00:40:22
【问题描述】:

我最近开始学习 python,但我还不是很擅长。 在尝试简单地从列表中删除项目时,我偶然发现了以下问题:“列表索引必须是整数或切片,而不是 str”。虽然我大致了解了问题的含义,但我仍然没有看到我做错了什么。代码如下:

list1=["1","2","4","5","3"]

for i in list1:
    if list1[i] in ["3"]:
        list1.pop(i)
        break
print(list1)

这是完整的错误:

TypeError Traceback (last recent call last) in 4 for i in list1: ----> 5 if list1[i] in ["3"]: 6 list1.pop(i)

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

【问题讨论】:

  • 当您执行for i in list1 时,您基本上是在循环遍历列表的元素,每个i"1""2"。现在你不能用这个i 索引列表,你需要使用for i in range(len(list1))。此外,您不应该在循环时修改列表。

标签: python python-3.x list


【解决方案1】:

list1 是一个字符串列表。这是因为数字有引号 - " "

在您的 for 循环中,您正在遍历这些字符串,循环 i 的每次迭代都设置为一个字符串,“1”,然后是“2”...

当您调用 pop(i) 时,您正在向其传递一个字符串,但您需要传递一个整数。

编辑:删除原始解决方案,因为它完全错误。下面是一个正确的解决方案。

打印你的程序正在发生的事情会很有帮助,例如在你的循环中你可以

print(i, type(i))

帮助跟踪正在发生的事情。

不确定您的最终目标是什么,但有一些很好的干净方法可以跟踪您正在放弃的内容。

for i, element in enumerate(list):

将让您同时访问当前元素和当前迭代。

在您的示例中使用它可能如下所示:

list1 = ["1", "2", "4", "5", "3"]
for i, element in enumerate(list):
    if element == "3":
        list.pop(i)
        break




【讨论】:

  • 对不起,这是完全错误的。 list1[i] 引入了一种间接方式。除了使用== 3 而不是in ["3"] 进行测试...
  • 哎呀那完全错了,更新了一个正确的答案。
【解决方案2】:

在您原来的 for 循环中,您正在遍历列表的每个元素,这些元素都是字符串。您收到的错误说您不能按字符串对列表进行切片,而是需要按整数切片。我建议按索引切片。

为此,您只需更改 for 循环的开始行:

for i in range(len(list1)):

现在它应该可以按预期工作了,因为它正在循环遍历列表的索引(即 0、1、2、3、4)。

【讨论】:

    【解决方案3】:

    您似乎误解了for-loop 是如何在您的列表中循环的。

    根据您的代码,它会遍历您的列表,而不是创建用于访问列表中元素的索引。如果你想给我们一个索引,你应该使用range()

    list1=["1","2","4","5","3"]
    
    for i in range(len(list1)):
        if list1[i]== "3":
            list1.pop(i)
            break
    print(list1)
    

    【讨论】:

    • 更好地使用 list1.remove("3") 来做同样的事情。
    【解决方案4】:

    执行以下操作:

    list1 = ["1","2","4","5","3"]
    
    for index,value in enumerate(list1):
        if value in ["3"] : # this condiation can be (value in ["3","2"])
            list1.pop(index)
            break
    print(list1)
    

    结果是['1', '2', '4', '5']

    编码愉快....

    【讨论】:

      【解决方案5】:

      当你做类似的事情时

      for i in list1
      

      i 获取列表中元素的值,因此 i 变为“1”、“2”等...这些是字符串,您不能用字符串索引列表。你最好做类似的事情

      for elem in list1:
          if elem in ['3']: ...
      

      当然,如果你只是想从列表中删除一个元素,你可以使用:

      if elem in list1:
          list1.remove(elem)
      

      【讨论】:

      • 并保护remove,以防元素不在列表中
      • 我会使用一个性能更高的异常,因为使用您的方法,该列表被搜索了 2 次。并建议不要使用list 作为变量名(迂腐,我知道...)
      • 我使用了 OP 的变量名。至于性能 - 我们是否有需要解决的性能问题?
      • OP 使用的是list1 而不是list
      • 显然我也是!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2017-10-09
      相关资源
      最近更新 更多