如何省略具有空(非零)值的键

时间:2017-09-12 09:26:08

标签: python python-2.7 python-3.x

我有一个dict { 'a': 'a', 'b': 0, 'c': {} },我需要省略所有具有空值的键(0不被视为空)。所以,这个输出应该是{ 'a': 'a', 'b': 0 }

{ 'a': 'a', 'b': 0, 'c': { 'd': 'd' } } - > { 'a': 'a', 'b': 0, 'c': { 'd': 'd' } };

我尝试了类似{k: v for k,v in my_dict.items() if not v}的内容,但我不确定如何保留0;

我正在寻找像https://lodash.com/docs/4.17.4#omitBy

这样的东西

4 个答案:

答案 0 :(得分:2)

您可以编写一个函数,根据值使用谓词进行过滤:

def omit_by(dct, predicate=lambda x: x!=0 and not x):
    return {k: v for k, v in dct.items() if not predicate(v)}

dct = { 'a': 'a', 'b': 0, 'c': {} }
print(omit_by(dct))
# {'a': 'a', 'b': 0}

dct =  {'a': 'a', 'b': 0, 'c': { 'd': 'd' } }
print(omit_by(dct))
# {'a': 'a', 'b': 0, 'c': {'d': 'd'}}

只需将谓词更改为适合您的内容。

答案 1 :(得分:1)

或许这样的事情?

res = { k:v for k,v in source_dict.items() if (hasattr(v, '__len__') and len(v) > 0) or isinstance(v, int) }

注意:您必须调整if ...部分理解以满足您的需求。这里的条件适用于您在示例中显示的类型,但您必须根据需要添加条件(同样,根据您在密钥中使用的不同类型,条件可能会增长很多......)

答案 2 :(得分:0)

def purify(dict):
    for k,v in dict:
        if isinstance(v, list) or isinstance(v, set) or isinstance(v, dict):
            if len(v) == 0:
                del dict[k]
    return dict

您可以这样使用它:dict = purify(src)

答案 3 :(得分:0)

为什么不定义一个函数来测试一个项目是否为空? ('空的'的定义可能非常适合我使用)

def not_empty(item):
    '''
    define what's empty
    '''
    if isinstance(item, (dict, list)) and (not item):
       return False
    if item is None:
       return False
    # add more situations?
    return True

    sample_dict = { 'a': 'a', 'b': 0, 'c': {} }

    result = {k:v for k,v  in sample_dict.items() if not_empty(v)}