我的python代码是如何越界的?

2024-09-30 06:14:38 发布

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

我一直在尝试将字符串(ex: aabbbacc)编码为类似a2b3a1c2 这是我尝试过的代码:

string_value = "aabbbacc"
temp_string = ""
for i in range(0, len(string_value)):
    if i != len(string_value) or i > len(string_value):
        temp_count = 1
        while string_value[i] == string_value[i+1]:
            temp_count += 1
            i += 1
        temp_string += string_value[i] + str(temp_count)
print(temp_string)

问题是,即使我添加了一个if条件来阻止越界发生,我仍然会得到错误

Traceback (most recent call last):
  File "C:run_length_encoding.py", line 6, in <module>
    while string_value[i] == string_value[i+1]:
IndexError: string index out of range

我也试过了

string_value = "aabbbacc"
temp_string = ""
for i in range(0, len(string_value)):
    count = 1
    while string_value[i] == string_value[i+1]:
        count += 1
        i += 1
        if i == len(string_value):
            break
    temp_string += string_value[i]+ str(count)
print(temp_string)

现在,我知道可能有更好的方法来解决这个问题,但我正在试图理解为什么我会得到越界异常,即使我有一个if条件来阻止它,我在逻辑的哪一部分出错请解释


Tags: inforstringlenifvaluecountrange
3条回答

问题在于:

for i in range(0, len(string_value)): # if i is the last index of the string
    count = 1
    while string_value[i] == string_value[i+1]: # i+1 is now out of bounds

避免越界的最简单方法是根本不索引字符串:

def encode(s):
    if s == '':   # handle empty string
        return s
    current = s[0]  # start with first character (won't fail since we checked for empty)
    count = 1
    temp = ''
    for c in s[1:]:  # iterate through remaining characters (string slicing won't fail)
        if current == c:
            count += 1
        else: # character changed, output count and reset current character and count
            temp += f'{current}{count}'
            current = c
            count = 1
    temp += f'{current}{count}'  # output last count accumulated
    return temp

print(encode('aabbbacc'))
print(encode(''))
print(encode('a'))
print(encode('abc'))
print(encode('abb'))

输出:

a2b3a1c2

a1
a1b1c1
a1b2

首先,这张支票很奇怪:

if i != len(string_value) or i > len(string_value):

第二,您检查i,但读取i+1的值,并且可能是下一个

因此,我的建议是把条件放在你的时间内

并且在检查i==len(string\u value)后,不允许读取string\u value[i]

(我提醒您:“break语句,就像在C中一样,从最内层的for或while循环中分离出来。”)

遍历字符串中的每个字符,然后检查下一个字符是否与当前字符相同。如果是,则添加一个,然后将计数添加到临时字符串并将计数重置为1

string_value = "aabbbacc"
temp_string = ""
count = 1
for i in range(len(string_value)-1):
    if string_value[i] == string_value[i+1]:
        count += 1
    else:
        temp_string += string_value[i]+ str(count)
        count = 1

#add the last char count
temp_string += string_value[i+1]+ str(count)

print(temp_string)
Out:  a2b3a1c2

相关问题 更多 >

    热门问题