Python错误类型: TypeError: 字符串索引必须是整数
我对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 个回答
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
方法。
问题在于你把一个字符串传给了 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
的变量?这样做没有意义,让我们很难理解你想要实现什么。