Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找字符串中不同相邻单词的存在次数_Python_Python 3.x - Fatal编程技术网

Python 查找字符串中不同相邻单词的存在次数

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] :

嗨,我正在写一个函数,它可以告诉你一个字符串中存在多少次不同的相邻字符。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] :
            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是避免切片和创建更多数据副本的好方法。从效率的角度来看,第一个代码是最好的方法,因为索引/切片比仅仅迭代要慢得多。很高兴听到!当您看到解决问题的正确答案时,通常应单击答案左侧的复选标记。