如何统计列表中数字出现次数并生成含次数与原数的新列表?
解决RLE编码函数的数值与次数配对问题
问题说明
需要实现encode_rle函数,接收列表flat_data,返回次数+对应数值交替排列的新列表。例如输入[15,15,15,6,6,6,7,7],输出应为[3,15,3,6,2,7]。
原代码的核心问题
- 元素顺序被打乱:使用
set(flat_data)会将原列表转为无序集合,破坏了元素在原列表中的出现顺序,最终输出的数值顺序会和输入不一致。 - 次数与数值未配对:最后直接拼接数值列表和次数列表,导致所有数值在前、所有次数在后,完全不符合“次数+数值”交替的要求。
修正后的实现代码
def encode_rle(flat_data): if not flat_data: return [] result = [] current_num = flat_data[0] count = 1 for num in flat_data[1:]: if num == current_num: count += 1 else: result.append(count) result.append(current_num) current_num = num count = 1 # 处理最后一组连续元素 result.append(count) result.append(current_num) return result
代码解释
- 先处理空列表的边界情况,避免索引错误;
- 从列表第一个元素开始,跟踪当前连续出现的数字和对应的计数;
- 遍历后续元素时,若和当前数字相同则计数累加,不同则将当前的计数和数字依次加入结果列表,再更新跟踪的数字和计数;
- 遍历结束后,不要忘记把最后一组连续元素的计数和数字加入结果;
- 最终得到的结果列表严格按照“次数、数值”交替的格式输出,完全符合需求。
内容的提问来源于stack exchange,提问作者danny
相关产品推荐
相关产品推荐

