Python 我怎样才能去掉字典中的无值?

Python 我怎样才能去掉字典中的无值?,python,Python,比如: for (a,b) in kwargs.iteritems(): if not b : del kwargs[a] 此代码引发异常,因为在迭代时更改了字典 我用另一本字典发现了唯一不漂亮的解决方案: res ={} res.update((a,b) for a,b in kwargs.iteritems() if b is not None) def filter_none(d): if isinstance(d, dict): return {k: filter_n

比如:

for (a,b) in kwargs.iteritems():
    if not b : del kwargs[a]
此代码引发异常,因为在迭代时更改了字典

我用另一本字典发现了唯一不漂亮的解决方案:

res ={}
res.update((a,b) for a,b in kwargs.iteritems() if b is not None)
def filter_none(d):
if isinstance(d, dict):
    return {k: filter_none(v) for k, v in d.items() if v is not None}
elif isinstance(d, list):
    return [filter_none(v) for v in d]
else:
    return d

谢谢

我喜欢你第二种方法的变化:

   res = dict((a, b) for (a, b) in kwargs.iteritems() if b is not None)
这是蟒蛇式的,我不觉得那么难看。您的第一个版本的一个变体是:

   for (a, b) in list(kwargs.iteritems()):
       if b is None:
            del kwargs[a]

另一种写作方式是

res = dict((k,v) for k,v in kwargs.iteritems() if v is not None)
在Python3中,这将成为

res = {k:v for k,v in kwargs.items() if v is not None}

您还可以使用
过滤器

d = dict(a = 1, b = None, c = 3)

filtered = dict(filter(lambda item: item[1] is not None, d.items()))

print(filtered)
{'a': 1, 'c': 3}
如果需要处理嵌套的
dict
s,则可以利用一种简单的递归方法:

# Python 2
from collections import Mapping

def filter_none(d):
    if isinstance(d, Mapping):
        return dict((k, filter_none(v)) for k, v, in d.iteritems() if v is not None)
    else:
        return d

# Python 3
from collections.abc import Mapping

def filter_none(d):
    if isinstance(d, Mapping):
        return {k: filter_none(v) for k, v in d.items() if v is not None}
    else:
        return d

对任何可能感兴趣的人来说,这里有另一种摆脱无价值的方法。我没有删除键,而是使用同一键的占位符更改
None
的值

一个用例是将Spark
RDD.map
应用到空值JSON上

def filter_null(data, placeholder="[spark]nonexists"):
    # Replace all `None` in the dict to the value of `placeholder`
    return dict((k, filter_null(v, placeholder) if isinstance(v, dict) else v if v 
is not None else placeholder) for k, v in data.iteritems())
样本输出:

>>> filter_null({'a':None,'b':"nul", "c": {'a':None,'b':"nul"}})
{'a': '[spark]nonexists', 'c': {'a': '[spark]nonexists', 'b': 'nul'}, 'b': 'nul'}
data = {'a': 'b', 'c': None, 'd':{'e': 'f', 'h': None, 'i':[{'j': 'k', 'l': None}]}}
print(filter_none(data))
>>> {'a': 'b', 'd': {'e': 'f', 'i': [{'j': 'k'}]}}

对于python3,将
iteritems()
更改为
items()

递归方法也可以过滤字典中嵌套的dict列表:

res ={}
res.update((a,b) for a,b in kwargs.iteritems() if b is not None)
def filter_none(d):
if isinstance(d, dict):
    return {k: filter_none(v) for k, v in d.items() if v is not None}
elif isinstance(d, list):
    return [filter_none(v) for v in d]
else:
    return d
样本输出:

>>> filter_null({'a':None,'b':"nul", "c": {'a':None,'b':"nul"}})
{'a': '[spark]nonexists', 'c': {'a': '[spark]nonexists', 'b': 'nul'}, 'b': 'nul'}
data = {'a': 'b', 'c': None, 'd':{'e': 'f', 'h': None, 'i':[{'j': 'k', 'l': None}]}}
print(filter_none(data))
>>> {'a': 'b', 'd': {'e': 'f', 'i': [{'j': 'k'}]}}

您可以只使用kwargs.items(),它已经返回一个列表。
dict.items()
不再返回Python3中的列表。它的工作原理更像是
iteritems()
除了代码之外,通常会在您的答案中添加一些注释。谢谢。将从下次开始这样做。