技术问询:生成列表各起始位置最长连续相同元素长度列表的方法
嘿,我来帮你补全这个解决方案,并且把每一步的逻辑掰扯清楚~
实现每个位置的最长连续相同元素长度
先直接上完整可运行的代码,再一步步解释逻辑:
完整代码
x_list = [1, 1, 2, 3, 3, 3] # 第一步:先把原列表转换成「连续元素+对应长度」的元组列表 freq_list = [] current = x_list[0] count = 0 for num in x_list: if num == current: count += 1 else: freq_list.append((current, count)) current = num count = 1 # 循环结束后别忘了把最后一组元素加进去,不然会漏掉 freq_list.append((current, count)) # 第二步:根据上面的频率列表生成目标结果 run_list = [] for val, length in freq_list: # 每个连续块对应的就是从length递减到1的序列,直接拼进去就行 run_list.extend(range(length, 0, -1)) print(run_list) # 输出正好是你要的 [2, 1, 1, 3, 2, 1]
逻辑拆解
统计连续元素的长度:
这部分你已经写了大半,核心就是遍历列表时,盯着当前元素current,统计它连续出现的次数count。一旦碰到不一样的元素,就把之前的统计结果存进freq_list,然后切换到新元素重新计数。最后一定要手动加一次最后一组,不然循环结束时最后一组还没存进去。生成目标列表:
拿到freq_list之后就简单了——比如某个元素连续出现了3次,那这三个位置对应的长度就是3、2、1;连续出现2次就是2、1。所以对每个元组,我们用range(length, 0, -1)生成递减序列,再用extend把这些序列拼起来,就得到最终的run_list了。
额外的边界处理
如果你的输入可能是空列表,记得先加个判断避免报错:
if not x_list: print([]) # 或者直接返回空列表,根据你的需求来 exit()
这样不管输入是啥情况,代码都能正常运行啦~
内容的提问来源于stack exchange,提问作者meriam
相关产品推荐
相关产品推荐

