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

3

我对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)

1
我稍微编辑了一下你的帖子,以澄清你的预期行为,基于你对furkle答案的评论。如果我有任何歧义,请告诉我! - Henry Keiter
2个回答

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',而所有非'e'字符则保持不变。
编辑:我可能误解了您的目的。作为语句的全部内容,word.split()并没有做任何事情- split不会重新分配,如果您想要在该语句之后使word等于字符串列表,则必须执行word = word.split()。但是-您为什么要首先拆分字符串呢?为什么要将两个单独的单词分配给名为word的单个变量?这没有任何意义,并且使我们很难理解您想要实现什么。

你在 join 中不需要内部的一次性列表:你可以在其中使用生成器表达式。 ''.join(ch if ch...) - Henry Keiter
好的...现在我在扫描时遇到了EOL错误。 - Lozdyck
1
@LeoLinden 我觉得我可能稍微误解了你在这里想要实现的目标。当你将word传递给print_list时,你是否打算让它成为一个字符串列表?因为split()不会在原地重新分配,所以你必须执行word = word.split()。 - furkle
如果我不把它转换成列表,而是保持字符串形式,会怎样呢?字符串可以像列表一样使用吗? - Lozdyck
@Leo,你现在传递给 print_list 的是一个字符串。你是否认为它是列表?如果是的话,你希望它会是什么呢? - Henry Keiter
显示剩余6条评论

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
这根本行不通 - 你不能在Python中重新分配字符串的索引。 - furkle
1
为什么不直接使用 toon.replace('e', '0') 呢? - Batuhan Tasdoven
1
@LeoLinden:这确实会创建一个新字符串,其中每个e都被替换为0...但是然后它只是将该新字符串丢弃。这正是您在使用split时遇到的问题。您需要在函数末尾返回toon,并且需要使用word = print_list(word)调用它。(此外,您真的应该重新命名该函数;当不接受列表且不打印任何内容时,称某物为print_list很容易产生歧义...) - abarnert
@BatuhanTasdoven:对于一个初学者提出的Python 3.x问题,使用Python 2.x示例可能会有点令人困惑... - abarnert
@abarnert 是的,我知道。我一直在努力解决它,但是没有成功,所以我去了Code Academy学习更多知识。当时我正在复习一些内容,看到了那个方法,于是我复制了框架并修改了内部代码以适应我的需求。对于造成的困惑,我感到很抱歉。 - Lozdyck
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接