比较字典并删除键:值对

时间:2018-01-16 18:23:24

标签: python-2.7 subset defaultdict

我有两个列表词典。

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”键中的其他子字典?

1 个答案:

答案 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}}]}

这是理想的行为吗?