比较Python中的字符串索引

时间:2018-10-01 05:51:00

标签: python

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

TypeError: string indices must be integers

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

program.py

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

4 个答案:

答案 0 :(得分:2)

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具有高级抽象,使您大多数时候都不会被索引所困扰。另外,很多事情都是可迭代的,甚至无法使用整数索引。上面的代码适用于任何可迭代传递给pairwise的方法,而不仅仅是字符串。

答案 1 :(得分:1)

在此短语中:

(use '[debux.core])

(defn max-subseq-sum [coll]
    (dbg (->> (take-while seq (iterate rest coll))                 ; tails (1)
          (mapcat #(reductions conj [] %))                        ; inits   (2)
          (apply max-key #(reduce + %)))))

(max-subseq-sum [1 2 3])


dbg: (->> (take-while seq (iterate rest coll)) (mapcat (fn* [p1__1991#] (re ... =>
| (take-while seq (iterate rest coll)) =>
|   ([1 2 3] (2 3) (3))
| (mapcat (fn* [p1__1991#] (reductions conj [] p1__1991#))) =>
|   ([] [1] [1 2] [1 2 3] [] [2] [2 3] [] [3])
| (apply max-key (fn* [p1__1992#] (reduce + p1__1992#))) =>
|   [1 2 3]

您正在遍历单个字母。因此,for i in myString: 在第一次迭代中的意思是myString[i],这当然是不可能的。

如果要保存字母和字母的顺序,可以使用'aabccddde'["a"]"enumerate"

"len"

答案 2 :(得分:0)

您可以使用枚举:

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')

答案 3 :(得分:0)

枚举将帮助遍历字符串中的每个字符和该字符的索引:

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