找出一个字符串中存在多少次不同的相邻单词

2024-05-14 06:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想写一个函数,可以告诉你有多少次不同的相邻字符退出字符串。i、 e LOLOLO有5次不同的相邻词。我试过很多次了,但每次我跑,我都会失败error:- line 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

Tags: 函数字符串forstringdefcount错误line
3条回答

当到达字符串末尾并要求输入不存在的“next”字符时,就会发生错误。当i是字符串中的最后一个索引(它被绑定在循环的末尾)时,请求string[i+1]是没有意义的。您可以使用切片表示法对减去最后一个字符的字符串进行迭代:for i, c in enumerate(string[:-1]): ...

代码高尔夫

import operator
s = 'LOLOLO'
sum(map(operator.ne, s, s[1:]))

索引不能超过字符串长度,可以使用string[:-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))

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

i在您的代码中也不需要,所以我删除了它,您不需要在python中初始化变量,i在循环中可以很好地工作

相关问题 更多 >

    热门问题