从字典中删除值

5

我有一个大字典,我想要从键中删除以某些特定值开头的值。下面是一个小字典的例子。

a_data = {'78567908': {'26.01.17', '02.03.24', '26.01.12', '04.03.03', '01.01.13', '02.03.01', '01.01.10', '26.01.21'}, '85789070': {'26.01.02', '09.01.04', '02.05.04', '02.03.17', '02.05.01'}, '87140110': {'03.15.25', '03.15.24', '03.15.19'}, '87142218': {'26.17.13', '02.11.01', '02.03.22'}, '87006826': {'28.01.03'}}

在我查阅字典后,我想要删除所有以 '26.' 或 '02.' 开头的键中的值。这可能会导致一些键没有值(即空集合)。

我已经有可行的代码:

exclude = ('26.', '02.')
f_a_data = {}
for k, v in a_data.items():
    f_a_data.setdefault(k,[])
    for code in v:
        print (k, code, not code.startswith(exclude))
        if not code.startswith(exclude):
            f_a_data[k].append(code)


print('Filtered dict:')
print(f_a_data)  

这会返回一个经过筛选的字典:
Filtered dict:
{'78567908': ['04.03.03', '01.01.13', '01.01.10'], '85789070': ['09.01.04'], '87140110': ['03.15.25', '03.15.24', '03.15.19'], '87142218': [], '87006826': ['28.01.03']}

问题1:这是过滤字典的最佳方式吗?

问题2:如何修改上面的代码片段以返回一个集合,就像原始字典一样?

1个回答

5

您的代码复杂度方面已经很不错了,但还是可以进行一些"python化"的优化,而且仍然保持可读性。

我的建议是:您可以使用嵌套推导式和all来重新构建字典,并测试是否应该包含值:

a_data = {'78567908': {'26.01.17', '02.03.24', '26.01.12', '04.03.03', '01.01.13', '02.03.01', '01.01.10', '26.01.21'}, '85789070': {'26.01.02', '09.01.04', '02.05.04', '02.03.17', '02.05.01'}, '87140110': {'03.15.25', '03.15.24', '03.15.19'}, '87142218': {'26.17.13', '02.11.01', '02.03.22'}, '87006826': {'28.01.03'}}
exclude = ('26.', '02.')

new_data = {k:{x for x in v if all(s not in x for s in exclude)} for k,v in a_data.items()}

结果:

>>> new_data
{'78567908': {'01.01.10', '01.01.13', '04.03.03'},
 '85789070': {'09.01.04'},
 '87006826': {'28.01.03'},
 '87140110': {'03.15.19', '03.15.25', '03.15.24'},
 '87142218': set()}

(这里使用字典推导式嵌套集合推导式(因为需要一个set),在all中使用生成器推导式)


“我该如何修改上面的代码片段,以便像原始字典一样返回值集合?” - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接