Python:从键值对列表生成无重复字段的查询排列组合
解决方案
核心思路是先将所有键值对按字段名分组,再生成各组的笛卡尔积——每个组合中每个字段仅选一个对应的值,这样就能得到所有符合要求的无重复字段的查询组合。
实现代码
import itertools # 解析后的键值对列表(用户提供的示例数据) search_pairs = [ 'field_1="books"', 'field_2="paper"', 'field_2="abcd"', 'field_4="test"', 'field_20="80"', 'field_20="443"', 'field_13="test"', 'field19="test"', 'field19="4"' ] # 1. 按字段名分组 field_groups = {} for pair in search_pairs: key = pair.split('=')[0] if key not in field_groups: field_groups[key] = [] field_groups[key].append(pair) # 2. 生成各组的笛卡尔积 # 提取每个字段对应的可选值列表 options = list(field_groups.values()) # 计算笛卡尔积,每个结果就是一个合法的查询组合 all_queries = list(itertools.product(*options)) # 3. 转换为列表格式(可选,也可以保留元组) all_queries = [list(query) for query in all_queries] # 打印结果示例 for query in all_queries[:2]: # 只打印前2个示例 print(query)
代码说明
- 分组处理:用字典
field_groups把同一个字段的所有键值对归类,比如field_2对应的列表是['field_2="paper"', 'field_2="abcd"']。 - 笛卡尔积生成:
itertools.product(*options)会遍历所有字段的可选值,生成所有可能的组合——每个组合里每个字段恰好出现一次,完全符合无重复字段的要求。 - 格式转换:把笛卡尔积返回的元组转换成列表,和你期望的输出格式一致。
示例输出
运行代码后,前两个结果如下(和你给出的期望输出匹配):
['field_1="books"', 'field_2="paper"', 'field_4="test"', 'field_20="80"', 'field_13="test"', 'field19="test"'] ['field_1="books"', 'field_2="paper"', 'field_4="test"', 'field_20="80"', 'field_13="test"', 'field19="4"']
递归实现版本
如果一定要用递归实现笛卡尔积逻辑,可以参考下面的简化版本:
def generate_combinations(groups): if not groups: return [[]] first_group = groups[0] rest_combinations = generate_combinations(groups[1:]) result = [] for item in first_group: for combo in rest_combinations: result.append([item] + combo) return result # 使用递归生成组合 all_queries_recursive = generate_combinations(options)
这个递归函数的逻辑是:每次取第一个字段的所有可选值,和剩余字段的所有组合拼接,最终得到所有合法查询。
内容的提问来源于stack exchange,提问作者effinRecursion
相关产品推荐
相关产品推荐

