我对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)
答案 0 :(得分: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.split()
等于该语句后的字符串列表。但是 - 你是否有理由首先尝试拆分字符串?为什么要为名为word
的单个变量分配两个单独的单词?这没有任何意义,并且使我们很难说出你想要完成的事情。
答案 1 :(得分:0)
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所指出的,由于strings
是immutable
,因此无法使用索引更改它们。因此,请使用连接或replace
方法。