来自其他语言,我知道如何比较字符串索引以测试是否相等。但是在Python中,当尝试比较字符串中的索引时出现以下错误。
TypeError: string indices must be integers
如何比较字符串的索引是否相等?
program.py
myString = 'aabccddde'
for i in myString:
if myString[i] == myString[i + 1]:
print('match')
答案 0 :(得分:2)
Python for
循环在其他语言中有时也称为“ foreach”循环。您没有遍历索引,而是遍历了字符串的字符。字符串是可迭代的,并且在迭代时会产生其字符。
您可能会发现this answer和this 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')