组合词典列表以形成新的词典列表

43 阅读2分钟

给定一个包含字典列表的 default 和一个字典 varying,其中每个字典都有相同的键。目标是创建一个新的字典列表,通过改变 default 中字典的某个值及其在 varying 中对应的值来实现。例如,如果 default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7},{"One": 9, "Two": 10, "Three" : 11}]varying = {"One": [12,13,14,15], "Two": [20,21,23], "Three": [12,44]}, 那么结果列表将包含以下字典:

  • {"One": 12, "Two": 2, "Three": 3}
  • {"One": 13, "Two": 2, "Three": 3}
  • {"One": 14, "Two": 6, "Three": 7}
  • {"One": 15, "Two": 10, "Three": 11}
  • {"One": 5, "Two": 20, "Three": 7}
  • {"One": 9, "Two": 23, "Three": 11}
  • {"One": 1, "Two": 2, "Three": 44}

huake_00066_.jpg

2、解决方案

方法一:使用列表解析

default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7},
{"One": 9, "Two": 10, "Three": 11}]
varying = {"One": [12, 13, 14, 15], "Two": [20, 21, 23], "Three": [12, 44]}

result = [dict(d.items() + [(k, x)])
              for d in default for k, v in varying.items() for x in v]

print(result)

输出:

[{'One': 1, 'Three': 12, 'Two': 2}, {'One': 1, 'Three': 44, 'Two': 2}, {'One': 1, 'Three': 3, 'Two': 20}, {'One': 1, 'Three': 3, 'Two': 21}, {'One': 1, 'Three': 3, 'Two': 23}, {'One': 12, 'Three': 3, 'Two': 2}, {'One': 13, 'Three': 3, 'Two': 2}, {'One': 14, 'Three': 3, 'Two': 2}, {'One': 15, 'Three': 3, 'Two': 2}, {'One': 5, 'Three': 12, 'Two': 6}, {'One': 5, 'Three': 44, 'Two': 6}, {'One': 5, 'Three': 7, 'Two': 20}, {'One': 5, 'Three': 7, 'Two': 21}, {'One': 5, 'Three': 7, 'Two': 23}, {'One': 12, 'Three': 7, 'Two': 6}, {'One': 13, 'Three': 7, 'Two': 6}, {'One': 14, 'Three': 7, 'Two': 6}, {'One': 15, 'Three': 7, 'Two': 6}, {'One': 9, 'Three': 12, 'Two': 10}, {'One': 9, 'Three': 44, 'Two': 10}, {'One': 9, 'Three': 11, 'Two': 20}, {'One': 9, 'Three': 11, 'Two': 21}, {'One': 9, 'Three': 11, 'Two': 23}, {'One': 12, 'Three': 11, 'Two': 10}, {'One': 13, 'Three': 11, 'Two': 10}, {'One': 14, 'Three': 11, 'Two': 10}, {'One': 15, 'Three': 11, 'Two': 10}]

方法二:使用循环

default = [{"One": 1, "Two": 2, "Three": 3}, {"One": 5, "Two": 6, "Three": 7},
{"One": 9, "Two": 10, "Three": 11}]
varying = {"One": [12, 13, 14, 15], "Two": [20, 21, 23], "Three": [12, 44]}

result = []
for d in default:
    for k, v in varying.items():
        for x in v:
            new_dict = dict(d)
            new_dict[k] = x
            result.append(new_dict)

print(result)

输出:

[{'One': 1, 'Three': 12, 'Two': 2}, {'One': 1, 'Three': 44, 'Two': 2}, {'One': 1, 'Three': 3, 'Two': 20}, {'One': 1, 'Three': 3, 'Two': 21}, {'One': 1, 'Three': 3, 'Two': 23}, {'One': 12, 'Three': 3, 'Two': 2}, {'One': 13, 'Three': 3, 'Two': 2}, {'One': 14, 'Three': 3, 'Two': 2}, {'One': 15, 'Three': 3, 'Two': 2}, {'One': 5, 'Three': 12, 'Two': 6}, {'One': 5, 'Three': 44, 'Two': 6}, {'One': 5, 'Three': 7, 'Two': 20}, {'One': 5, 'Three': 7, 'Two': 21}, {'One': 5, 'Three': 7, 'Two': 23}, {'One': 12, 'Three': 7, 'Two': 6}, {'One': 13, 'Three': 7, 'Two': 6}, {'One': 14, 'Three': 7, 'Two': 6}, {'One': 15, 'Three': 7, 'Two': 6}, {'One': 9, 'Three': 12, 'Two': 10}, {'One': 9, 'Three': 44, 'Two': 10}, {'One': 9, 'Three': 11, 'Two': 20}, {'One': 9, 'Three': 11, 'Two': 21}, {'One': 9, 'Three': 11, 'Two': 23}, {'One': 12, 'Three': 11, 'Two': 10}, {'One': 13, 'Three': 11, 'Two': 10}, {'One': 14, 'Three': 11, 'Two': 10}, {'One': 15, 'Three': 11, 'Two': 10}]