如何找出列表中最长的连续相同元素序列的长度?
如何找出列表中最长的连续相同元素序列的长度?
你遇到的这个问题太常见了!确实,collections.Counter只能帮你统计每个元素总共出现了多少次,完全不管是不是连续的。用循环来实现其实特别直观,我给你两种靠谱的写法:
方法一:基础手动循环实现
这是最容易理解的方式,完全靠自己控制遍历和计数逻辑:
首先得考虑边界情况——如果列表是空的,直接返回0就行。如果列表非空,咱们初始化两个变量:current_length用来记录当前正在统计的连续序列长度,max_length用来存目前找到的最长序列长度,一开始都设为1(因为至少有一个元素嘛)。
然后从列表的第二个元素开始,逐个和前一个元素对比:
- 如果和前一个元素相同,就把
current_length加1,同时更新max_length(取它自己和current_length里更大的那个) - 如果不一样,说明当前连续序列断了,把
current_length重置回1
代码示例:
def longest_consecutive_length(nums): if not nums: return 0 max_length = current_length = 1 for i in range(1, len(nums)): if nums[i] == nums[i-1]: current_length += 1 if current_length > max_length: max_length = current_length else: current_length = 1 return max_length # 用你的测试列表试试 test_list = [1, 1, 2, 2, 2, 3, 3] print(longest_consecutive_length(test_list)) # 输出3,正好是你要的结果
方法二:用itertools.groupby简化代码
如果你不想写那么多循环逻辑,Python标准库的itertools.groupby可以帮你把连续的相同元素自动分组,然后咱们只需要统计每个组的长度,再取最大的那个就行。虽然不是纯手动写循环,但代码更简洁,也很Pythonic:
from itertools import groupby def longest_consecutive_length(nums): if not nums: return 0 # 用groupby分组后,每个组的长度就是连续序列的长度,取最大的那个 return max(len(list(group)) for key, group in groupby(nums)) test_list = [1, 1, 2, 2, 2, 3, 3] print(longest_consecutive_length(test_list)) # 同样输出3
两种方法都能解决你的问题,如果你想练手循环逻辑,就用第一种;如果追求代码简洁,第二种肯定更省心。
内容来源于stack exchange
相关产品推荐
相关产品推荐

