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

问题描述:

我对Python很陌生,所以如果这是一个愚蠢的错误,请原谅我!Python错误TypeError:字符串索引必须是整数

我一直在密码生成器工作,目前在科技俱乐部。它的工作原理是它要求你输入一个单词。你输入的单词变成了一个列表。然后它将列表中的每个字母更改为其他内容以创建唯一密码(这是有缺陷的,我知道)。当我运行代码时,它说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的回答的评论,我已经编辑了你的文章一点点,以澄清你的预期行为。如果我歪曲了你,请告诉我! – 2014-11-03 23:58:49

For loop已经给你下一个可用的项目的。在你的情况下,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指出,因为stringsimmutable,他们不能使用索引进行更改。所以使用串联或者replace方法。

+1

这根本不起作用 - 你不能在python中重新分配一个字符串的索引。 – furkle 2014-11-03 23:41:17

+0

很酷。我不是那个沮丧的人,所以我不能扭转它,但请注意,用户可能不清楚他们打算做什么。据他们说,他们可能想要通过一个列表而不是一个字符串。 – furkle 2014-11-03 23:50:37

+0

这并没有造成任何错误,但它并没有改变e的值为0的 – LeoLinden 2014-11-03 23:53:37

问题是你传递一个字符串到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.split()。但是 - 是否有一个原因是你试图首先拆分字符串?为什么要将两个单独的单词分配给一个名为word的变量?这没有任何意义,并且使我们很难说出你想要完成的事情。

+0

@LeoLinden如果你愿意,你可以这样做,或者像Batuhan说的那样,你可以使用'enumerate'来获取任何给定索引处的字符以及该索引的整数。但是如果你看第二段,那不会解决你的方法,因为你不能通过python中的字符串索引重新分配字符。 – furkle 2014-11-03 23:40:21

+0

你不需要你的'join'中的内部一次性列表:你可以在那里使用一个生成器表达式。 '''.join(ch ch if ...)' – 2014-11-03 23:42:39

+0

好的...现在我在扫描错误时收到EOL – LeoLinden 2014-11-03 23:42:50