【问题标题】:Remove values from dictionary从字典中删除值
【发布时间】:2018-12-18 14:30:01
【问题描述】:

我有一个大字典,如果键以某些值开头,我会尝试从键中删除值。下面是字典的一个小例子。

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:如何修改上述 sn-p 以返回与原始 dict 类似的集合中的值?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您的代码在复杂性方面完全没问题,但可以稍微“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中的生成器理解)

    【讨论】:

    • 引用 OP:“我如何修改上面的 sn-p 以返回像原始字典一样的集合中的值?”
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2021-04-09
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多