Python错误类型: TypeError: 字符串索引必须是整数

3 投票
2 回答
6338 浏览
提问于 2025-05-01 10:36

我对Python还不太熟悉,所以如果我犯了什么低级错误,请多包涵!

我正在制作一个密码生成器,准备在技术俱乐部展示。这个程序的工作原理是让你输入一个单词。你输入的单词会被转换成一个列表。然后,它会把列表中的每个字母都换成其他字符,从而生成一个独特的密码(虽然这个方法有点问题,我知道)。但是当我运行代码时,它提示我 TypeError: string indices must be integers。我的代码哪里出错了呢?

print ("Leo's Password Generator")
print ('Please enter a word')
word = input()


print ('Enter another word:')
word2 = input()
word = word2 + word
word.split()

def print_list(toon):
    for i in toon:
        if toon[i] == 'e':
            toon[i] = '0'


print_list(word)
print (word)
暂无标签

2 个回答

0

For循环已经可以直接给你下一个可用项的。在你的例子中,i并不是一个索引,而是本身。

不过,如果你想同时获取索引和对应的值,可以使用enumerate

def print_list(toon):
    for i, ch in enumerate(toon):
        if ch == 'e':
            toon = toon[:i] + '0' + toon[i+1:]

    print(toon)

或者你也可以用传统的方法来遍历字符串:

def print_list(toon):
    for i in range(len(toon)):
        if toon[i] == 'e':
            toon = toon[:i] + '0' + toon[i+1:]

    print(toon)

编辑:正如@furkle提到的,由于字符串不可变的,不能通过索引来修改它们。所以可以使用拼接或者replace方法。

1

问题在于你把一个字符串传给了 print_list。当你遍历一个字符串时,它会把字符串拆分成单个字符的字符串。所以,实际上你是在调用 toon['a'],这不行,因为你需要用一个整数来通过索引访问可迭代对象。

另外,你和Batuhan在处理字符串时也犯了错误。即使你修正了上面的错误,之后你还会立刻遇到另一个问题。在Python中,string 不允许直接修改其中的字符,所以你必须创建一个全新的字符串,而不是重新分配其中的某个字符。

如果你愿意,可以使用列表推导式来以更少的空间完成同样的任务。这里有个例子:

def print_list(toon):
    return ''.join([ch if ch != 'e' else '0' for ch in toon])

这个例子创建了一个新的字符串,里面所有的 'e' 都被替换成了 '0',而其他的字符保持不变。

补充一下:我可能误解了你的意图。word.split() 作为一个完整的语句并没有任何作用——split 不会重新赋值,如果你想让 word 等于一个字符串列表,你需要写成 word = word.split()。但是——你为什么要拆分这个字符串呢?而且为什么要把两个不同的单词赋值给一个叫 word 的变量?这样做没有意义,让我们很难理解你想要实现什么。

撰写回答