【问题标题】:Compare String Indices in Python比较 Python 中的字符串索引
【发布时间】:2023-04-02 02:34:01
【问题描述】:

来自其他语言,我知道如何比较字符串索引以测试是否相等。但是在 Python 中,尝试比较字符串中的索引时出现以下错误。

TypeError: string indices must be integers

如何比较字符串的索引是否相等?

program.py

myString = 'aabccddde'
for i in myString:
    if myString[i] == myString[i + 1]:
        print('match')

【问题讨论】:

  • 使用for i in range(len(myString))。使用您的代码,您正在访问该字符串中的每个字符,而不是索引。
  • 您想比较相邻索引处的字符,而不是索引本身。

标签: python


【解决方案1】:

Python for 循环有时在其他语言中称为“foreach”循环。您不是在遍历索引,而是在遍历字符串的字符。字符串是可迭代的,并在迭代时产生它们的字符。

您可能会发现this answerthis answer 的一部分有助于了解Python 中for 循环的工作原理。

关于您的实际问题,itertools documentation 有一个名为 pairwise 的方法。您可以复制粘贴该函数或从more_itertools(需要安装)导入它。

演示:

>>> # copy recipe from itertools docs or import from more_itertools
>>> from more_itertools import pairwise
>>> myString = 'aabccddde'
>>>
>>> for char, next_char in pairwise(myString):
...     if char == next_char:
...         print(char, next_char, 'match')
... 
a a match
c c match
d d match
d d match

在我看来,我们应该尽可能避免在迭代时显式使用索引。 Python 具有高级抽象,可让您在大多数情况下不会被索引所牵制。此外,很多东西都是可迭代的,甚至不能用整数索引。上面的代码适用于 any 被传递给 pairwise 的可迭代对象,而不仅仅是字符串。

【讨论】:

    【解决方案2】:

    在这句话中:

    for i in myString:
    

    您正在迭代单个字母。所以myString[i]在第一次迭代中意味着'aabccddde'["a"],当然不可能。

    如果您想保存字母和字母的顺序,您可以使用"enumerate""len"

    myString = 'aabccddde'
    for i in range(len(myString)-2):
        if myString[i] == myString[i + 1]:
            print('match')
    

    【讨论】:

      【解决方案3】:

      你可以使用枚举:

      myString = 'aabccddde'
      l = len(myString)
      for i,j in enumerate(myString):
          if i == l-1:    # This if block will prevent the error message for last index
              break
          if myString[i] == myString[i + 1]:
              print('match')
      

      【讨论】:

        【解决方案4】:

        Enumerate 将有助于遍历字符串中的每个字符和字符的索引:

        myString = 'aabccddde'
        for idx, char in enumerate(myString, ):
            # guard against IndexError
            if idx+1 == len(myString):
                break
            if char == myString[idx + 1]:
                print('match')
        

        【讨论】:

          猜你喜欢
          • 2015-03-18
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          • 1970-01-01
          • 2019-01-17
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          相关资源
          最近更新 更多