Python模式查找函数开发:找出数字列表中出现最多的重复子串
实现GetPattern函数:找出数字列表中多数元素共有的最长子串
需求很明确:给定一个数字列表,写一个GetPattern函数,返回在大多数数字里重复出现的最长数字子串。比如示例里的[1234, 9912349, 578],1234出现在前两个数字中(超过列表长度的一半),所以返回它。
实现思路
- 转字符串处理:把所有数字转换成字符串,方便截取和匹配子串。
- 定义多数阈值:“大多数”按超过列表长度一半来算,比如列表长度为3时,阈值是2;长度为4时,阈值是3。
- 统计子串出现次数:遍历每个数字字符串,生成所有可能的子串,统计每个子串在多少个不同的数字里出现(同一个数字里重复出现的子串只算一次)。
- 筛选最优子串:从符合次数要求的子串里,挑最长的;长度相同的话,优先选出现次数多的。
代码实现
def GetPattern(num_list): # 将数字列表转为字符串列表 str_list = [str(num) for num in num_list] n = len(str_list) if n == 0: return "" # 计算多数阈值:超过列表长度的一半 threshold = (n // 2) + 1 # 存储子串及其覆盖的数字数量 substring_count = {} for s in str_list: # 记录当前数字中已统计过的子串,避免重复计数 seen = set() str_len = len(s) # 生成所有可能的非空子串 for start in range(str_len): for end in range(start + 1, str_len + 1): substr = s[start:end] if substr not in seen: seen.add(substr) substring_count[substr] = substring_count.get(substr, 0) + 1 # 筛选出符合阈值的子串 valid_substrings = [sub for sub, cnt in substring_count.items() if cnt >= threshold] if not valid_substrings: return "" # 按长度降序、出现次数降序排序,取第一个 valid_substrings.sort(key=lambda x: (-len(x), substring_count[x])) return valid_substrings[0] # 示例测试 ListOfNumbers = [1234, 9912349, 578] print(GetPattern(ListOfNumbers)) # 输出:1234
关键细节说明
- 同一个数字里的重复子串只算一次:比如数字是
123123,子串123出现两次,但统计时只算该数字包含这个子串一次。 - 边界处理:空列表直接返回空字符串;没有符合条件的子串也返回空。
- 排序逻辑:优先选最长的子串,长度相同则选覆盖数字更多的,确保结果符合需求。
内容的提问来源于stack exchange,提问作者user19519009
相关产品推荐
相关产品推荐

