【问题标题】:Python error TypeError: string indices must be integersPython错误TypeError:字符串索引必须是整数
【发布时间】:2014-12-30 18:04:33
【问题描述】:

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

【问题讨论】:

  • 我根据您对 furkle 的回答对您的帖子进行了一些编辑,以澄清您的预期行为。如果我完全歪曲了你,请告诉我!

标签: python typeerror


【解决方案1】:

问题是您将字符串传递给print_list。当您遍历一个字符串时,它会将其拆分为单个字符串。所以,基本上你正在做的是调用toon['a'],这是行不通的,因为你必须使用一个整数来访问一个可迭代的索引。

还要注意,您和 Batuhan 在处理字符串的方式上都犯了错误。即使您修复了上述错误,之后您仍然会立即获得另一个错误。在 python 中,string 不允许项目分配,因此您将不得不创建一个全新的字符串,而不是在其中重新分配单个字符。

如果您愿意,您可能可以使用列表推导式在更小的空间内完成相同的任务。这是一个例子:

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

这会从 toon 创建一个新字符串,其中所有出现的“e”都已替换为“0”,并且所有非“e”字符都像以前一样保留。

编辑:我可能误解了你的目的。 word.split() 因为整个语句没有做任何事情 - split 不会重新分配,如果您想在该语句之后使用等于字符串列表的字词,则必须执行 word = word.split()。但是-您是否有理由首先尝试拆分字符串?为什么要将两个单独的单词分配给一个名为word 的变量?这没有任何意义,而且让我们很难说出你想要完成的事情。

【讨论】:

  • @LeoLinden 如果您愿意,您可以这样做,或者像 Batuhan 所说的那样,您可以使用 enumerate 来获取任何给定索引处的字符和该索引的整数。但是,如果您查看第二段,那将无法解决您的方法,因为您无法通过 python 中的字符串中的索引重新分配字符。
  • 您不需要join 中的内部一次性列表:您可以在其中使用生成器表达式。 ''.join(ch if ch...)
  • 好的...现在我在扫描错误期间收到 EOL
  • @LeoLinden 我想我可能稍微误解了你在这里想要完成的事情。当您将 word 传递给 print_list 时,您是否打算将它作为字符串列表?因为 split() 不会重新分配,所以你必须做 word = word.split()。
  • @Leo 如果您还有其他问题,请提出其他问题。答案的 cmets 不是调试不相关问题的正确位置。
【解决方案2】:

For loop 已经为您提供了下一个可用项目的价值。在您的情况下,i 不是 index,它是 value 本身。

但是,如果你想同时达到索引和值,你可以使用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 方法。

【讨论】:

  • 这根本行不通 - 你不能在 python 中重新分配字符串的索引。
  • 酷。我不是投反对票的人,所以我无法扭转它,但请注意,用户可能不清楚他们打算做什么。据他们说,他们可能想要传递一个列表而不是一个字符串。
  • 这并没有导致任何错误,但它没有将 e 更改为 0
  • 你为什么不直接使用,toon.replace('e', '0')
  • @LeoLinden:这确实创建了一个新字符串,其中每个e 替换为0……但随后它只是将新字符串扔掉了。这与split 遇到的问题完全相同。函数末尾需要return toon,调用时需要使用word = print_list(word)。 (另外,你真的应该重命名函数;当不带列表也不打印任何东西时,调用 print_list 会产生误导......)
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 2016-03-26
  • 2016-02-17
  • 2023-03-03
  • 1970-01-01
  • 2022-11-02
  • 2019-04-26
  • 2020-08-04
相关资源
最近更新 更多