不使用groupby实现数字游程编码:编写Python频率元组列表函数
问题解决:手动实现整数的连续数字计数
先看你代码里的几个明显问题:
- 字符串是不可变类型,你直接
str(n) = str(n)[j:]是语法错误,得先把整数转成字符串存到变量里再操作。 - 嵌套循环逻辑完全乱了:j的范围没做限制,会直接触发索引越界;而且每次找到相同字符就往列表里加,导致重复记录,根本没统计连续次数。
- while循环里每次都调用
str(n),但n本身没变化,会陷入死循环。
下面是正确的实现方式,逻辑简单直接,完全不用内置分组函数:
def compress(n): s = str(n) if not s: return [] result = [] current_char = s[0] count = 1 # 从第二个字符开始遍历 for char in s[1:]: if char == current_char: count += 1 else: # 遇到不同字符,把当前统计的组加入结果 result.append((current_char, count)) current_char = char count = 1 # 别忘了把最后一组加入结果 result.append((current_char, count)) return result print(compress(11122)) # 输出 [('1', 3), ('2', 2)] print(compress(11122311)) # 输出 [('1', 3), ('2', 2), ('3', 1), ('1', 2)]
代码逻辑说明:
- 先把输入整数转成字符串
s,方便逐个字符处理。 - 初始化
current_char为第一个字符,count为1,用来统计当前字符的连续出现次数。 - 从第二个字符开始遍历:
- 如果和当前字符相同,计数加1;
- 如果不同,就把当前的(字符,计数)元组加入结果列表,然后切换当前字符为新字符,计数重置为1。
- 遍历结束后,最后一组字符还没加入列表,所以要手动加一次。
内容的提问来源于stack exchange,提问作者user249018
相关产品推荐
相关产品推荐

