如何按规则从alt与runs两组列表生成所有英文短语?
解决方案
核心思路
先按每个元素类型确定对应位置的可选值,再生成所有合法组合,最后过滤并拼接成短语:
- 对每个位置,根据
alt类型定义可选内容:constant:只能保留对应runs元素(必须包含)variable:只能忽略(对应空值)article/o-constant:可选择保留或忽略对应runs元素verb:可选择保留单个对应runs元素,或全不保留
- 生成所有可能的组合(笛卡尔积),过滤掉包含多个
verb的非法组合 - 过滤每个组合中的空值,按原顺序拼接成短语
代码实现(Python)
import itertools def generate_phrases(alt, runs): # 为每个位置生成可选值列表 options = [] verb_indices = [] for idx, (a, r) in enumerate(zip(alt, runs)): if a == "constant": options.append([r]) elif a == "variable": options.append([""]) elif a in ["article", "o-constant"]: options.append(["", r]) elif a == "verb": options.append(["", r]) verb_indices.append(idx) phrases = [] # 生成所有可能的组合 for combo in itertools.product(*options): # 检查verb规则:最多一个非空的verb verb_count = 0 for idx in verb_indices: if combo[idx] != "": verb_count += 1 if verb_count > 1: break if verb_count > 1: continue # 过滤空值,拼接成短语 phrase_parts = [part for part in combo if part != ""] if phrase_parts: # 避免空短语(因为至少有constant) phrases.append(" ".join(phrase_parts)) # 去重(如果有重复组合)并返回 return list(set(phrases)) # 示例测试 alt = ["constant", "variable", "constant", "o-constant"] runs = ["fix", "something", "for", "a meal"] result = generate_phrases(alt, runs) for p in result: print(p)
代码解释
- 选项定义:遍历
alt和runs的配对,为每个位置生成允许的取值列表,同时记录所有verb的位置索引。 - 组合生成:用
itertools.product生成所有可能的组合(笛卡尔积),覆盖所有可选元素的选择情况。 - 合法性过滤:对每个组合统计非空
verb的数量,超过1的直接跳过。 - 短语拼接:过滤组合中的空字符串,将剩余部分按原顺序拼接成短语,最后去重(避免因不同组合生成相同短语)。
示例输出
运行示例代码后,会得到以下合法短语:
fix for fix for a meal
内容的提问来源于stack exchange,提问作者ZZZ
相关产品推荐
相关产品推荐

