You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 分组处理:用字典field_groups把同一个字段的所有键值对归类,比如field_2对应的列表是['field_2="paper"', 'field_2="abcd"']。
  2. 笛卡尔积生成:itertools.product(*options)会遍历所有字段的可选值,生成所有可能的组合——每个组合里每个字段恰好出现一次,完全符合无重复字段的要求。
  3. 格式转换:把笛卡尔积返回的元组转换成列表,和你期望的输出格式一致。

示例输出

运行代码后,前两个结果如下(和你给出的期望输出匹配):

['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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:20:34