我有两个列表词典。
big_dict = defaultdict(list)
small_dict defaultdict(list)
big_dict = {StepOne:[{PairOne:{key1: value1}}, {PairTwo:{key2: value2}}, {PairThree: {key3: value3}}]}
small_dict = {key1: value1}
是否有可能在“StepOne”中找到第二个字典的子集并删除“StepOne”键中的其他子字典?
答案 0 :(得分:1)
我打赌有更多的pythonic方式来做,但这应该可以解决你的问题:
big_dict = {'A0':[{'a':{'ab':1}, 'b':{'bb':2}, 'c':{'cc':3}}], 'A1':[{'b':{'bb':1}, 'c':{'bb':5}, 'd':{'cc':3}}]}
small_dict = {'bb':2, 'cc':3}
for big_key in big_dict.keys():
for nested_key in big_dict[big_key][0].keys():
ls_small = [ x for x in small_dict if x in big_dict[big_key][0][nested_key]]
if not ls_small:
del big_dict[big_key][0][nested_key]
else:
ls_small = [ y for y in ls_small if small_dict[y] is big_dict[big_key][0][nested_key][y]]
if not ls_small:
del big_dict[big_key][0][nested_key]
ls_small = []
我已添加了另一个主词典'A1'
,以使其更具代表性。这样做是通过主词典('A0'
,'A1'
)的键遍历,然后通过第一组嵌套词典('a', 'b',...
)的键。它选择嵌套字典作为列表的第一个元素 - 主要字典的值。
对于每个嵌套字典,它会检查small_dict
中的任何键是否属于它的子字典。 sibdictionary由big_dict[big_key][nested_key]
提取,因为它是嵌套字典的值。如果在子字典中找到small_dict
个密钥,它们将临时存储在ls_small
中。
如果嵌套字典的ls_small
在密钥检查步骤后为空,则表示该嵌套字典中没有来自small_dict
的密钥,并且删除了嵌套字典。如果它不为空,则else
部分检查值的匹配 - 如果值不匹配,则再次删除条目。
此示例的输出为:
{'A1': [{'d': {'cc': 3}}], 'A0': [{'c': {'cc': 3}, 'b': {'bb': 2}}]}
注意 - 就像现在一样,如果只有一个small_dict
键:值对匹配,该方法将保留嵌套字典,这意味着此表单的输入
big_dict = {'A0':[{'a':{'bb':2}, 'b':{'bb':2, 'cc': 5}, 'c':{'cc':3}}], 'A1':[{'b':{'bb':1}, 'c':{'bb':5}, 'd':{'cc':3}}]}
将产生
{'A1': [{'d': {'cc': 3}}], 'A0': [{'a': {'bb': 2}, 'c': {'cc': 3}, 'b': {'cc': 5, 'bb': 2}}]}
这是理想的行为吗?