在Python中使用值== None
从字典中删除键的正确方法是什么?
答案 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'}]}}