0

我一直在尝试将字符串编码(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 条件来防止它,我在逻辑的哪一部分出错了请解释...

4

3 回答 3

2

首先,这个检查很奇怪:

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

其次,您检查 i 但读取 i+1 的值,并且可能接下来...

所以我的建议是将条件放在你的 while 中。

并且在检查 i==len(string_value) 之后不允许读取 string_value[i]。

(我提醒你:“break 语句,就像在 C 中一样,跳出最里面的 for 或 while 循环。”)

于 2020-03-13T17:03:57.153 回答
1

遍历字符串中的每个字符,然后检查下一个字符是否与当前字符相同。如果是,则添加另一个将计数添加到临时字符串并将计数重置为 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
于 2020-03-13T17:17:29.300 回答
1

问题在这里:

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
于 2020-03-13T17:14:12.573 回答