比较字典并删除 key:value 对
Compare dictionaries and delete key:value pairs
我有两个列表字典。
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' 键中的另一个子字典?
我敢打赌有更多 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
中的任何键是否是其子字典的一部分。子字典由 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
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}}]}
这是期望的行为吗?
我有两个列表字典。
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' 键中的另一个子字典?
我敢打赌有更多 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
中的任何键是否是其子字典的一部分。子字典由 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
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}}]}
这是期望的行为吗?