将dict限制为具有值的元素有哪些更具python风格的方法?

将dict限制为具有值的元素有哪些更具python风格的方法?,python,Python,给出了一份物品清单 sample = { 'a':1 , 'b':2 , 'c':3 , 'd':None , 'e':None } 我想创建一个新的dict,它只包含具有值的项 这很有效 a = dict([ i for i in testing.iteritems() if i[1]]) 但我想知道是否还有更具python风格/可读性的东西 我希望我能像这样做 a = dict([ i for i in testing.____() if i.value() ]) 但是没有一个标准的迭

给出了一份物品清单

sample = { 'a':1 , 'b':2 , 'c':3 , 'd':None , 'e':None }
我想创建一个新的dict,它只包含具有值的项

这很有效

a = dict([ i for i in testing.iteritems() if i[1]])
但我想知道是否还有更具python风格/可读性的东西

我希望我能像这样做

a = dict([ i for i in testing.____() if i.value() ])
但是没有一个标准的迭代器是这样工作的

出于可读性的目的,我对此很好奇。

使用元组解包(将每个键和值分配给单独的变量,
k
v
,在以下示例中)和dict理解:

a = {k: v for k, v in sample.iteritems() if v}
或者显式测试
None
而不是所有假值(数字0、空序列等):

在Python3中,只需使用
items()

对于您的样品,上述所有变化导致:

>>> sample = { 'a':1 , 'b':2 , 'c':3 , 'd':None , 'e':None }
>>> {k: v for k, v in sample.iteritems() if v}
{'a': 1, 'c': 3, 'b': 2}

您可以使用
听写理解
:-

>>> {key: value for key, value in sample.iteritems() if value}
0: {'a': 1, 'b': 2, 'c': 3}
注意:如果使用Python3,只需使用sample.items(),因为这是2.7和3的不同之处。

Python3:

sample =  {'a': 1, 'e': 0, 'd': None}
k = {k: v for k, v in sample.items() if v is not None}

>>> k
{'a': 1, 'e': 0}

您的解决方案还将删除值为0(零)的项,而不仅仅是
None
。您可能希望
i[1]改为None
。接得好!我完全不想要。这是用来处理API结果的。在我多年的Python生涯中,我从来不知道dict理解。这真让我大吃一惊。我本该预料到的——考虑到列表的理解。但是哇。这就像吃蛋糕,吃蛋糕,吃更多的蛋糕。
>>> {key: value for key, value in sample.iteritems() if value}
0: {'a': 1, 'b': 2, 'c': 3}
sample =  {'a': 1, 'e': 0, 'd': None}
k = {k: v for k, v in sample.items() if v is not None}

>>> k
{'a': 1, 'e': 0}