【发布时间】:2015-06-23 23:30:00
【问题描述】:
如果多个列表中的字典共享一个共同的键值对,如何组合它们?
例如,这里有三个字典列表:
l1 = [{'fruit':'banana','category':'B'},{'fruit':'apple','category':'A'}]
l2 = [{'type':'new','category':'A'},{'type':'old','category':'B'}]
l3 = [{'order':'2','type':'old'},{'order':'1','type':'new'}]
期望的结果:
l = [{'fruit':'apple','category':'A','order':'1','type':'new'},{'fruit':'banana','category':'B','order':'2','type':'old'}]
棘手的部分是我希望这个函数只接受列表作为参数而不是键,因为我只想插入任意数量的字典列表而不关心哪些键名是重叠的(在这种情况下,将所有三个组合在一起的键名是“类别”和“类型”)。
我应该注意索引应该无关紧要,因为它应该只基于公共元素。
这是我的尝试:
def combine_lists(*args):
base_list = args[0]
L = []
for sublist in args[1:]:
L.extend(sublist)
for D in base_list:
for Dict in L:
if any([tup in Dict.items() for tup in D.items()]):
D.update(Dict)
return base_list
【问题讨论】:
-
l1和l3之间没有共同对。单个列表中的所有字典都具有相同的键。有保障吗? -
是的,这是故意的,因为 l1 中的字典应该能够通过 l2 中的字典与 l3 中的字典匹配(例如 {'fruit':'banana','category':'B '} 与 {'order':'2','type':'old'} 合并为 {'type':'old','category':'B'} 连接它们)。假设单个列表中的所有字典都具有相同的键。
-
我建议您严格检查您的算法和数据结构,这样您就不必处理这样的怪事了。
-
..特别是
condense_sets()function。注意:dict.view*()方法返回支持某些集合操作的对象。
标签: python list dictionary pattern-matching itertools