使用以下词典:
dict_filter_test = {'name_one_key': {'name_one_value': ['random_one',
'random_two',
'random_three',
'random_four',
'random_five',
'random_six']},
'name_two_key': {'name_two_value': ['random_one',
'random_two',
'random_three',
'random_four',
'random_five',
'random_six']}}
我正在尝试排除包含以下内容的字符串:
filter = set(['six', 'two'])
这是我到目前为止所做的:
def filtered_dict():
for key, value in dict_filter_test.items():
for value, name in value.items():
list = [string for string in name
if not any(word in string for word in filter)]
print (list)
return dict_filter_test
以下是我想要获得的输出:
{'name_one_key': {'name_one_value': ['random_one',
'random_three',
'random_four',
'random_five']},
'name_two_key': {'name_two_value': ['random_one',
'random_three',
'random_four',
'random_five']}}
答案 0 :(得分:2)
您必须重新分配已过滤列表的结果,重复使用相同的引用,否则更改将丢失。
为此,循环值的值(不需要键)。对于每个列表,使用列表推导重建新的筛选列表,并使用切片表示法分配回结果(以保持相同的参考)
filt = ['six', 'two'] # you don't need a set here
for v in dict_filter_test.values():
for v2 in v.values():
v2[:] = [x for x in v2 if all(f not in x for f in filt)]
结果:
{'name_two_key': {'name_two_value': ['random_one', 'random_three', 'random_four', 'random_five']},
'name_one_key': {'name_one_value': ['random_one', 'random_three', 'random_four', 'random_five']
}}
替代方法,如果您想使用嵌套字典理解完全重建字典:
dict_filter_test = { k:{k2:[x for x in v2 if all(f not in x for f in filt)] for k2,v2 in v.items()} for k,v in dict_filter_test.items()}