过滤/排除字典中的值列表(Python 3)

时间:2018-06-08 19:35:45

标签: python list dictionary

使用以下词典:

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

1 个答案:

答案 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()}