Python 查找字符串中不同相邻单词的存在次数
嗨,我正在写一个函数,它可以告诉你一个字符串中存在多少次不同的相邻字符。i、 e LOLOLO有5次不同的相邻单词。我尝试过很多次,但每次我运行时,都会出现错误:-第5行,在相邻的\u编号中 如果c!=字符串[i+1]: 索引器错误:字符串索引超出范围Python 查找字符串中不同相邻单词的存在次数,python,python-3.x,Python,Python 3.x,嗨,我正在写一个函数,它可以告诉你一个字符串中存在多少次不同的相邻字符。i、 e LOLOLO有5次不同的相邻单词。我尝试过很多次,但每次我运行时,都会出现错误:-第5行,在相邻的\u编号中 如果c!=字符串[i+1]: 索引器错误:字符串索引超出范围 def adjacent_numbers(string): count = 0 i = 0 for i,c in enumerate(string): if c != string[i+1] :
def adjacent_numbers(string):
count = 0
i = 0
for i,c in enumerate(string):
if c != string[i+1] :
count += 1
i += 1
return count
当到达字符串末尾并要求输入不存在的“next”字符时,就会发生错误。当
i
是字符串中的最后一个索引(它被绑定在循环的末尾)时,请求string[i+1]
是没有意义的。您可以使用切片表示法对字符串减去最后一个字符进行迭代:对于枚举中的i,c(字符串[:-1]):…
您不能索引超过字符串长度的字符串,您可以使用字符串[:-1]
从末尾切片一个,但可以避免切片您可以使用for循环和iter
:
s = "LOLOLO"
def adj(s):
# iter create an iterator
it, sm = iter(s), 0
# pull first character and set prev equal to it
prev = next(it)
# iterate over all bar the first char
for ch in it:
# if previous is not equal to current char add 1 to sm
if ch != prev:
sm += 1
# set prev to current char
prev = ch
# catch last char
return sm + (prev != ch)
输出:
In [3]: adj(s)
Out[3]: 5
您还可以使用enumerate欺骗一点,您可以使用不会导致索引器的切片,您还可以使用内置的sum
函数进行计数:
def adj(s):
return sum(ch != s[i:i+1] and i < len(s) for i, ch in enumerate(s, 1))
print(adj(s))
def调整:
返回和(ch!=s[i:i+1]和i
enumerate还接受一个start arg,在本例中是一个,因此我们从第二个字符开始索引
将相同的逻辑应用于您自己的循环:
def adjacent_numbers(string):
count = 0
for i,c in enumerate(string, 1):
if i < len(s) and c != string[i:i+1]:
count += 1
return count
def相邻_编号(字符串):
计数=0
对于枚举中的i,c(字符串,1):
如果我
i
在您的代码中也不需要,所以我删除了它,您不需要在python中初始化变量,i
在循环中可以正常工作。代码高尔夫
import operator
s = 'LOLOLO'
sum(map(operator.ne, s, s[1:]))
字还是字?如果出现错误,请将错误添加到问题描述中。
i
的值由for循环为您填写。您可以删除i=0
和i+=1
。对不起,假设是characterIt,似乎您要做的是计算字符组的数量,其中每个组都尽可能大,并且该组中的所有字符都相同。是这样吗?e、 g.AABCCC->3,AABBAB->4。在这种情况下,你不应该为LOLOLO获得6分吗?这是一个聪明的想法,但有点难读,当然不适合一个几乎不能理解for循环的初学者。短变量名没有帮助。为什么不使用count
而不是sm
?我是python新手,所以我不太了解该代码是如何工作的。感谢您的解释不用担心,答案中的大部分内容都是非常基本的内容,sum
将是编写for循环的惯用方法,而iter是避免切片和创建更多数据副本的好方法。从效率的角度来看,第一个代码是最好的方法,因为索引/切片比仅仅迭代要慢得多。很高兴听到!当您看到解决问题的正确答案时,通常应单击答案左侧的复选标记。