Python实现从单词列表中找出可由4个公共字母组成的单词
不用正则实现找出指定公共字母组成的单词组
嘿,这个需求很好实现!不用正则完全能搞定,我给你梳理个清晰的思路和代码示例:
核心思路
我们要找的是所有字母都属于某4个公共字母集合的单词,说白了就是:单词的字母集合是这个4字母集合的子集。基于这个逻辑,步骤大概是这样:
- 把每个单词转换成小写字母的集合(自动去重,还能忽略大小写差异);
- 生成所有可能的4字母组合集合;
- 对每个4字母集合,筛选出所有字母集合是它子集的单词;
- 把至少包含2个单词的分组保留下来,就是我们要的结果。
代码实现
import itertools letter = 4 word = "Demo Deer Deep Deck Cere Reep Creep Creeps" split_word = word.split() # 把每个单词映射为它的小写字母集合 word_char_sets = {w: set(w.lower()) for w in split_word} # 收集所有出现过的字母,去重 all_unique_chars = set() for chars in word_char_sets.values(): all_unique_chars.update(chars) # 生成所有长度为letter的字母组合(转为集合方便后续判断) candidate_char_sets = [set(combo) for combo in itertools.combinations(all_unique_chars, letter)] # 筛选符合条件的单词组 result_groups = {} for candidate in candidate_char_sets: # 找出所有字母集合是候选子集的单词 matched_words = [w for w, chars in word_char_sets.items() if chars.issubset(candidate)] # 只保留至少有2个单词的分组 if len(matched_words) >= 2: # 把候选字母排序后转成字符串,作为分组的键(方便查看) group_key = ''.join(sorted(candidate)) result_groups[group_key] = matched_words # 输出结果 for key, words in result_groups.items(): print(f"公共字母组合: {key}") print(f"对应的单词: {', '.join(words)}") print("---")
代码说明
set(w.lower()):快速把单词转成去重的小写字母集合,比如Deer会变成{'d','e','r'},Creep变成{'c','r','e','p'};itertools.combinations:生成所有可能的4字母组合,确保我们不会漏掉任何潜在的公共字母组;chars.issubset(candidate):这是核心判断——检查单词的所有字母是不是都来自候选的4字母集合,完全符合你“可由这4个字母组成”的需求;- 最后我们只保留至少有2个单词的分组,避免出现单个单词的无效组。
运行这段代码后,你会得到符合预期的结果:
公共字母组合: depr
对应的单词: Deer, Deep, Reep公共字母组合: cepr
对应的单词: Cere, Reep, Creep
如果你需要调整规则,比如要求分组至少有3个单词,只需要把len(matched_words) >= 2改成>=3就行,非常灵活。
内容的提问来源于stack exchange,提问作者NoviceMe
相关产品推荐
相关产品推荐

