获取嵌套字典的所有可能组合

-3 投票
1 回答
50 浏览
提问于 2025-04-14 16:25

我想要获取一个多选答案表单的所有可能组合。

我有这个字典:

{
"question": "Gender?",
"choices": ["Male", "Female", "Non Bynary", "Other"],
"child":{
  "question": "Country?",
  "choices": ["USA", "Canada", "France", "Other"],
  "children":{
    "question": "Age?",
    "choices": ["<20", "20-30", "30-40", "40+"],
  }
 }
}

我想得到的是:

[
 {
  "choice": "Male",
  "child":{
   "choice": "USA",
   "child":{
    "choice": "<20"
   }
  }
 },
 {
  "choice": "Male",
  "child":{
   "choice": "USA",
   "child":{
    "choice": "20-30"
   }
  }
 },
 {
  "choice": "Male",
  "child":{
   "choice": "USA",
   "child":{
    "choice": "30-40"
   }
  }
 },
]

等等,我试过用itertools和简单的递归循环,但都没有成功,你能帮我吗?

我尝试过这样做:

list_children = {key + str(j): dict(zip(val.keys(), k))
                     for key, val in hierarchical_questions.items()
                     for j, k in enumerate(product(*val.values()))}

但是它给我的结果是:

'str' object has no attribute 'values'

我试过这个,但在递归语句上卡住了。

def test_list_choices(hierarchical_questions, parent_choice=None):
    if parent_choice is None:
        parent_choice = {}
    list_children = []
    for choice in hierarchical_questions['choices']:
        if parent_choice is None:
            parent_choice = choice
            list_children.append({
                "choice": choice.choice,
            })
        elif parent_choice == choice:
            for child in hierarchical_questions['child']:
                for child_choise in child["child"]:
                    #list_children.append()
                    print(child_choise)
    return list_children

还有很多其他的递归函数,但它们却无限循环。

1 个回答

0

如果你不太在意效率的话,可以用一个简单的递归函数来实现:

def generate_combinations(question_dict, combination=None):
    if combination is None:
        combination = []

    if "choices" not in question_dict:
        return [combination]

    combinations = []
    for choice in question_dict["choices"]:
        current_combination = combination + [{"choice": choice}]
        if "child" in question_dict:
            child_combinations = generate_combinations(question_dict["child"], current_combination)
            combinations.extend(child_combinations)
        elif "children" in question_dict:  # Added for children key
            child_combinations = generate_combinations(question_dict["children"], current_combination)
            combinations.extend(child_combinations)
        else:
            combinations.append(current_combination)

    return combinations

撰写回答