如何用Python生成带分隔符的字符串单词所有组合?
问题分析
你需要生成目标字符串中所有非空单词子集的组合,每个子集内的单词用指定分隔符连接,且保持原字符串中的单词顺序。你之前的代码只覆盖了连续前缀的组合,漏掉了非连续子集(比如good-student)和单个单词的情况,所以不符合预期。
最优解决方案
使用itertools.combinations生成所有符合要求的单词子集,再遍历分隔符完成拼接,具体代码如下:
import itertools def create_name_combos(mystring, separators): words = mystring.split() combos = set() # 遍历所有可能的子集长度(1到单词总数) for subset_length in range(1, len(words) + 1): # 生成当前长度下的所有单词组合(保持原字符串顺序) for word_subset in itertools.combinations(words, subset_length): # 用每个分隔符拼接当前子集 for sep in separators: combos.add(sep.join(word_subset)) # 转为有序列表返回(也可以直接返回集合,按需调整) return sorted(combos)
代码说明
- 分割字符串:将输入字符串按空格拆分为单词列表。
- 生成子集:通过
itertools.combinations生成所有非空的单词子集,确保子集内单词顺序与原字符串一致。 - 拼接组合:对每个子集,用所有指定分隔符进行拼接,存入集合自动去重(避免意外重复)。
- 返回结果:将集合转为有序列表返回,方便查看。
测试验证
调用示例:
# 测试代码 result = create_name_combos("good university student", ["-", "+"]) for item in result: print(item)
输出结果(排序后):
good good-student good-university good-university-student good+student good+university good+university+student student university university-student university+student
这个结果完全覆盖了你给出的预期输出。
原代码问题说明
你之前的代码存在以下缺陷:
- 仅处理了连续前缀的组合,无法生成非连续的子集(比如
good-student)。 - 没有生成单个单词的情况。
- 循环逻辑错误,
range(len(words)-1)会漏掉最后一个单词的处理,且拼接方式有误。
内容的提问来源于stack exchange,提问作者Mahdi Talebi
相关产品推荐
相关产品推荐

