【问题标题】:Python3 TypeError: list indices must be integers or slices, not strPython3 TypeError:列表索引必须是整数或切片,而不是str
【发布时间】:2016-03-12 11:31:04
【问题描述】:

我的任务是将字符串 'AAAABBBCCDAABBB' 放入这样的列表中:['A','B','C','D','A','B']

我现在为此工作了 2 个小时,但我无法找到解决方案。到目前为止,这是我的代码:

list = []

string = 'AAAABBBCCDAABBB'

i = 1

for i in string:
    list.append(i)

print(list)

for element in list:
    if list[element] == list[element-1]:
        list.remove(list[element])

print(list)

我是编程新手,总是出现错误“TypeError: list indices must be integers or slices, not str”...

我已经更改了比较

if list[element] == list[element-1]

if list[element] is list[element-1]

但错误保持不变。我已经用谷歌搜索了几次,但总是有不需要字符串格式的列表,但我需要它(对吗?)。

感谢您的帮助! 无抗体

【问题讨论】:

  • 元素是string,可迭代的索引必须是数字而不是字符串
  • element in list 中,element 是列表元素,而不是列表索引。如果需要索引,请使用for index in range(len(list))for index,element in enumerate(list)
  • 正如 danidee 所说,当您说 for element in list 时,您正在获取列表中的实际项目而不是项目的索引。因此,您以后不能做 list[element]

标签: string list python-3.x int typeerror


【解决方案1】:

首先,不要在内置 python 语句或数据结构(如 listtuple 甚至是您导入的模块的名称之后)命名您的变量,这也适用于文件。例如,将您的文件命名为 socket.py 并导入 socket 模块肯定会导致错误(我会让您自己尝试)

在你的代码中element是一个字符串,一个可迭代的索引必须是数字而不是字符串,所以你可以告诉python

把位置 2 的物品给我。

但现在你想说给我A 位置的项目,这在英语中甚至都无效,无语的编程语言。

如果您想在循环时获取可迭代对象的索引,则应该使用 enumerate 函数,或者您可以这样做

for i in range(len(list))

并循环遍历列表的长度范围,无论如何您并不需要这些元素。

这是您想要做的更简单的方法

s = string = 'AAAABBBCCDAABBB'

ls = []

for i in s:
    if ls:
        if i != ls[-1]:
            ls.append(i)
    else:
        ls.append(i)

print(ls)

【讨论】:

    【解决方案2】:

    这是一种不同的方法,但您的问题可以使用 itertools.groupby 解决,如下所示:

    from itertools import groupby
    
    string = 'AAAABBBCCDAABBB'
    answer = [group[0] for group in groupby(string)]
    print(answer)
    

    输出

    ['A', 'B', 'C', 'D', 'A', 'B']
    

    根据文档,groupby

    创建一个从可迭代对象中返回连续键和组的迭代器

    在我的示例中,我们使用列表推导来迭代连续的键和组,并使用索引 0 仅提取键。

    【讨论】:

    • 虽然这并不能解决 OP 的索引问题,但我认为这是最好的方法。
    • 是的 - 这是一种略有不同的方法,但我认为值得添加作为答案。
    【解决方案3】:

    你可以试试下面的代码:

    list = []
    
    string = 'AAAABBBCCDAABBB'
    
    # remove the duplicate character before append to list
    prev = ''
    for char in string:
        if char == prev:
            pass
        else:
            list.append(char)
            prev = char
    print(list) 
    

    输出:

    ['A', 'B', 'C', 'D', 'A', 'B']
    

    【讨论】:

      【解决方案4】:

      在您的循环中,element 是字符串。你想拥有索引

      试试for i, element in enumerate(list)

      编辑:i 现在将成为您当前正在迭代的element 的索引。

      【讨论】:

      • 错误消失了,但现在列表是['A','B','C','D','A','A','B','B','B']
      【解决方案5】:

      我有同样的问题,但我比较的是字符串而不是索引 def check_client(数据): 检查 = 假 对于客户端中的数据: 如果数据['name'] 是客户['name']: 数据['数量']+=客户['数量'] 打印('存在') 检查=真 休息 如果检查 ==假: add_client(数据)

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
      猜你喜欢
      • 2018-10-13
      • 2017-11-08
      • 2015-12-09
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多