如果值为None,则创建Python dict并省略项目

时间:2016-05-11 15:48:31

标签: python dictionary

我将描述下面的动机,但基本问题是:我希望能够做到这样的事情:

# THIS DOESN'T WORK
def foo(var1, var2):
    d = {
        'a': var1,
        'b': var2 if var2 is not None,  # SyntaxError
    }
    return d

>>> foo(3, 4)
{'a': 3, 'b': 4}
>>> foo(3, None)
{'a': 3}

此说明不起作用,因为您不允许没有值的dict (key, value)对。你必须这样做

{'b': var2 if var2 is not None else <some value>}

我想要做的是将'b'项完全排除在返回词典之外。

有各种合理的Pythonic方法可以做到这一点,但是我能想到的所有方法都要求你迭代一个长度 - n 可迭代,其中 n foo的参数数量:

# This works
def foo(var1, var2):
    mapping = [
        ('a', var1),
        ('b', var2),
    ]
    d = {k: v for (k, v) in mapping if v is not None}
    return d


# As does this
def foo(var1, var2):
    d = {
        'a': var1,
        'b': var2,
    }
    for k, v in d.iteritems():
        if v is None:
            d.pop(k)
    return d

这并不昂贵,但能够在一次操作中构建dict会很不错。 你可以在一次操作中构建dict吗?

动机,如果您感兴趣:foo实际上调用构造函数MyObj(**d),并且此构造函数可以采用可变数量的参数。但是,初始化MyObj.b = None与初始化MyObj.b不同。不,我不能改变MyObj :)。

更新:Martijn Pieters的回答here基本上说你做不到;你要么必须处理一个单独的迭代,要么之后添加密钥(它推广到所有参数的循环)。如果仍然如此,我很高兴这个问题被关闭。

0 个答案:

没有答案