Python 2.7 比较字典并删除键:值对

Python 2.7 比较字典并删除键:值对,python-2.7,subset,defaultdict,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”键中删除另一个子字典?

我有两本词典

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”键中删除另一个子字典?

我打赌有一种更类似于Python的方法,但这应该可以解决您的问题:

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',…
)。它选择嵌套字典作为列表的第一个元素—主字典的值

big_dict = defaultdict(list)
small_dict defaultdict(list)


big_dict = {StepOne:[{PairOne:{key1: value1}}, {PairTwo:{key2: value2}}, {PairThree: {key3: value3}}]}


small_dict = {key1: value1}
对于每个嵌套字典,它检查
small\u dict
中的任何键是否是其子字典的一部分。sibdictionary由
big_dict[big_key][nested_key]
获取,因为它是嵌套字典的值。如果在子词典中找到
small\u dict
键,它们将临时存储在
ls\u small

如果该嵌套字典的
ls\u small
在键检查步骤后为空,则表示该嵌套字典中不存在
small\u dict
中的键,并且该嵌套字典将被删除。如果不为空,则
else
部分检查值是否匹配-如果值不匹配,则再次删除条目

本例的输出为:

{'A1': [{'d': {'cc': 3}}], 'A0': [{'c': {'cc': 3}, 'b': {'bb': 2}}]}
注意-目前的情况是,如果只有一个
small\u dict
key:value对匹配,则该方法将保留嵌套字典,这意味着此表单的输入

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

这是期望的行为吗?

您能提供期望的输出吗?从我看来你想删除PairOne:dict吗?@atru我想看到这样的东西:big_dict={StepOne:{PairOne:{key1:value1}}}}}正如你所看到的,所有其他嵌套的dict都应该被删除。问题是big_dict每次都是动态创建的。我不知道嵌套的字典有哪些键,你是说,除了小字典里的东西外,什么都要删除吗?@atru,是的。你说得对。删除所有嵌套的dict(已建立除外)。相反,PairOne、PairTwo子CT是否在StepOne中?如果他们是,请解决你的问题-他们似乎不是。我现在应该检查一下。请稍等几分钟!您的算法返回错误AttributeError:“list”对象没有属性“keys”,如果您在big_dict上看到,这是defaultdict(list)。这个dict有列表结构:
big_dict={StepOne:[{PairOne:{key1:value1}},{PairTwo:{key2:value2}},{pairtree:{key3:value3}}}
我认为你的算法应该像这样迭代I在范围内(len(big_dict['StepOne]),但我不确定,我忽略了最初的默认dict,使用了您最初的输入。我得走了,开个会。如果没有其他人做的话,我会在以后解决。我改变了你的算法。现在它工作正常,并得到了预期的结果。非常感谢!!!!!你帮了我很多!:)太好了:)你是怎么改变的?我可以在答案中加上这一点。我现在正准备这么做。