在Python

时间:2015-11-19 06:55:21

标签: python dictionary

在Python中使用值== None从字典中删除键的正确方法是什么?

8 个答案:

答案 0 :(得分:28)

通常,您将创建一个通过过滤旧的dict构建的新{k: v for k, v in original.items() if v is not None} 。字典理解对于这类事情很有用:

filtered = {k: v for k, v in original.items() if v is not None}
original.clear()
original.update(filtered)

如果您必须更新原始字典,您可以这样做......

original.iteritems()

这可能是我能想到的最“干净”的原位移除方法(在你迭代时修改dict是不安全的)

在python2.x上使用RGB

答案 1 :(得分:5)

如果你需要递归删除 None 值,最好使用这个:

window.tk.call('tk', 'scaling', 2.0)

答案 2 :(得分:2)

您还可以获取dict的副本,以避免在更改原始dict时进行迭代。

for k, v in dict(d).items():
    if v is None:
        del d[k]

但对于较大的词典来说,这可能不是一个好主意。

答案 3 :(得分:2)

如果您不想复制

for k,v  in list(foo.items()):
   if v is None:
      del foo[k]

答案 4 :(得分:1)

对于python 2.x

dict((k, v) for k, v in original.items() if v is not None)

答案 5 :(得分:0)

您也可以使用del命令

执行此操作
   f = {};
   f['win']=None
   f
   => {'win': None}
   del f['win']

或者,如果你想要这样的函数格式,你可以这样做:

def del_none_keys(dict):
    for elem in dict.keys():
        if dict[elem] == None:
           del dict[elem]

答案 6 :(得分:0)

Python3 递归版

def drop_nones_inplace(d: dict) -> dict:
    """Recursively drop Nones in dict d in-place and return original dict"""
    dd = drop_nones(d)
    d.clear()
    d.update(dd)
    return d

def drop_nones(d: dict) -> dict:
    """Recursively drop Nones in dict d and return a new dict"""
    dd = {}
    for k, v in d.items():
        if isinstance(v, dict):
            dd[k] = drop_nones(v)
        elif isinstance(v, (list, set, tuple)):
            # note: Nones in lists are not dropped
            # simply add "if vv is not None" at the end if required
            dd[k] = type(v)(drop_nones(vv) if isinstance(vv, dict) else vv 
                            for vv in v) 
        elif v is not None:
            dd[k] = v
    return dd

答案 7 :(得分:-1)

也许您会发现它有用:

def clear_dict(d):
    if d is None:
        return None
    elif isinstance(d, list):
        return list(filter(lambda x: x is not None, map(clear_dict, d)))
    elif not isinstance(d, dict):
        return d
    else:
        r = dict(
                filter(lambda x: x[1] is not None,
                    map(lambda x: (x[0], clear_dict(x[1])),
                        d.items())))
        if not bool(r):
            return None
        return r

它将:

clear_dict(
    {'a': 'b', 'c': {'d': [{'e': None}, {'f': 'g', 'h': None}]}}
)

->

{'a': 'b', 'c': {'d': [{'f': 'g'}]}}