小甲鱼课后作业:压缩字符串(不知道哪里错了,希望有大佬找一下问题谢谢!))
希望大佬们能耐心看一下Input=input(":")
mm=0
w=[]
for i in Input:
ii=Input.index(i) #这里的index应该有问题
if Input==Inputand ii>0:
mm+=1
elif Input!=Input and mm>1 and ii>1:
w.append(Input+str(mm))
mm=0
elif Input!=Input and mm<=1 and ii>1:
w.append(Input)
mm=0
print(w)
结果:
:aaasss(这是我输入的字符串)
['', '', ''] #虽然逻辑不正确,但是为什么列表里的东西没有一个字母?
期望输出啥 wp231957 发表于 2022-6-22 17:32
期望输出啥
https://xxx.ilovefishc.com/forum/202112/18/190216nwihqnqnir1nxawq.png
这是效果图 hello? 发表于 2022-6-22 17:37
这是效果图
两个连续的字母不需要压缩 本帖最后由 白two 于 2022-6-22 18:27 编辑
hello? 发表于 2022-6-22 17:37
这是效果图
Input.index(i) 返回的是第一个 i 的匹配结果
循环第一次是 a, 返回的index是 0
循环第二次是 a, 返回的index是 0
循环第三次是 a, 返回的index是 0
循环第四次是 s, 返回的index是 3
Input = "aaasss"
w = []
for i in Input:
ii = Input.index(i)
print(ii)
结果:
0
0
0
3
3
3
所以你不能用index函数区提取下标, 直接 range(len(Input)) 都比他好 def foo(string: str) -> str:
res = "" # 返回压缩后的字符串
carry = None # 携带之前的字符,和现在的字符做比较
count = 0 # 如果出现相同字符,则加一
for n, char in enumerate(string):
if not n: # 当访问第一个字符时
carry = char
count = 1
elif carry == char: # 当出现和之前的字符相同的字符时
count += 1
elif count < 3: # 当相同字符数量小于 3
res += carry * count
carry = char
count = 1
else: # 当相同字符数量大于等于 3
res += carry + str(count)
carry = char
count = 1
# 原字符串尾端结算
if count and count < 3: # 当相同字符数量小于 3
res += carry * count
else: # 当相同字符数量大于等于 3
res += carry + str(count)
return res
A = "FFiiiisshCCCCCC"
B = foo(A)
rate = len(B) / len(A) * 100.
print(A, B, rate, sep = '\n')FFiiiisshCCCCCC
FFi4sshC6
60.0 本帖最后由 白two 于 2022-6-22 18:51 编辑
把你的代码改了一下:
Input = "iikkkkkvlllmmv"
# Input = input(":")
# 去特殊化处理, 末尾加一个能终止重复的字符, 就不需要对末尾字符单独处理
if Input[-1] != '_':
Input = Input + '_'
else:
Input = Input + '='
mm = 1
w = []
for idx in range(len(Input)):
# 判断是否和前面重复
if Input == Input and idx > 0:
mm += 1
# 终止重复, 且重复两次以上
elif Input != Input and mm > 2 and 1 < idx:
w.append(Input + str(mm))
mm = 1
# 终止重复, 但只重复两次 或者 不重复
elif Input != Input and mm <= 2 and 1:
w.append(Input)
mm = 1
print(''.join(w))
iik5vl3mmv 白two 发表于 2022-6-22 18:49
把你的代码改了一下:
感谢 傻眼貓咪 发表于 2022-6-22 18:35
谢谢你
页:
[1]