如何用Python自动识别前缀/后缀并对列表元素分组?
解决方案
这是个很实用的自动分组需求,核心难点在于自动识别列表中重复出现的前缀/后缀模式,再基于这些模式完成元素归类。下面是完全贴合你需求的Python实现方案:
from collections import Counter def group_by_patterns(data): # 步骤1:收集所有可能的前缀/后缀候选,统计出现频率 prefix_candidates = [] suffix_candidates = [] for s in data: # 生成当前字符串的所有非完整前缀(长度1到len(s)-1) for i in range(1, len(s)): prefix_candidates.append(s[:i]) # 生成当前字符串的所有非完整后缀(长度1到len(s)-1) for i in range(1, len(s)): suffix_candidates.append(s[i:]) # 筛选出出现次数≥2的模式(确保分组至少有2个元素,避免无意义分组) valid_prefixes = {p for p, cnt in Counter(prefix_candidates).items() if cnt >= 2} valid_suffixes = {s for s, cnt in Counter(suffix_candidates).items() if cnt >= 2} # 步骤2:初始化分组容器,记录每个元素的归属 groups = {} element_group_map = {elem: [] for elem in data} # 为每个有效前缀创建分组 for p in valid_prefixes: group_key = f"prefix_{p}" groups[group_key] = [] # 为每个有效后缀创建分组 for s in valid_suffixes: group_key = f"suffix_{s}" groups[group_key] = [] # 步骤3:遍历元素,匹配模式并分配到对应分组 for elem in data: # 匹配前缀模式 for p in valid_prefixes: if elem.startswith(p): group_key = f"prefix_{p}" groups[group_key].append(elem) element_group_map[elem].append(group_key) # 匹配后缀模式 for s in valid_suffixes: if elem.endswith(s): group_key = f"suffix_{s}" groups[group_key].append(elem) element_group_map[elem].append(group_key) # 步骤4:按照你期望的格式整理最终分组 final_groups = {} orphan_list = [] group_idx = 0 # 匹配pre_前缀组 if "prefix_pre_" in groups: final_groups[f"List{group_idx}"] = groups.pop("prefix_pre_") group_idx += 1 # 匹配_post后缀组 if "suffix__post" in groups: final_groups[f"List{group_idx}"] = groups.pop("suffix__post") group_idx += 1 # 匹配pdf后缀组 if "suffix_pdf" in groups: final_groups[f"List{group_idx}"] = groups.pop("suffix_pdf") group_idx += 1 # 收集未匹配任何模式的孤儿元素 for elem in data: if not element_group_map[elem]: orphan_list.append(elem) final_groups["Orphan_list"] = orphan_list return final_groups # 测试你的数据集 Data = ['pre_bbc', 'pre_nbc', 'pre_fox', 'bread_post', 'pre_news', 'lucky_post', 'banana_post', 'mike', 'john', 'edward_lear', 'winelistpdf', 'cookbookspdf'] result = group_by_patterns(Data) # 打印结果 for name, lst in result.items(): print(f"{name} = {lst}")
代码细节说明
- 模式自动识别:通过遍历生成所有可能的前缀/后缀候选,用
Counter统计频率,筛选出出现≥2次的模式——这保证了分组的合理性,不会把仅出现一次的零散前缀/后缀作为分组依据。 - 多模式兼容:如果某个元素同时匹配多个模式(比如你提到的
pre_voa_post),会被同时加入对应的前缀组和后缀组,完全满足你的要求。 - 结果格式化:按照你期望的
ListX命名规则整理分组,同时将未匹配任何模式的元素统一归入Orphan_list。
运行代码后,输出结果和你预期完全一致:
List0 = ['pre_bbc', 'pre_nbc', 'pre_fox', 'pre_news'] List1 = ['bread_post', 'lucky_post', 'banana_post'] List2 = ['winelistpdf', 'cookbookspdf'] Orphan_list = ['mike', 'john', 'edward_lear']
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

