Python词典,关键存在与后备

时间:2012-08-15 14:58:52

标签: python

这些方法之间是否有任何区别,缺点或缺点?

foo = dict(key=u"")
bar = foo.get('key', 'foobar')

VS

foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'

6 个答案:

答案 0 :(得分:6)

您绝对不应该使用第二种形式,因为如果您的字典中不存在该键,它将抛出KeyError。您只能从第二种形式获得可接受的行为,因为密钥已设置。

答案 1 :(得分:4)

第一段代码尝试从与foo相关联的key获取值,如果foo没有密钥key,则默认为{{1 }}。所以这里有两种情况:

  1. foobar的密钥为foo,因此key设置为bar
  2. foo[key]没有密钥foo,因此key设置为bar
  3. 第二个查看与"foobar"中的密钥key相关联的值,如果该值为假(即,如果foo),则默认为bool(foo[key])==False }。如果foobar没有密钥foo,则会引发key。所以这里有三个案例:

    1. KeyError包含密钥fookey,因此bool(foo[key])==True设置为bar
    2. True包含密钥fookey,因此bool(foo[key])==False设置为bar
    3. "foobar"没有密钥foo,因此代码会引发key

答案 2 :(得分:3)

如果KeyError不存在,第二个示例将引发foo['key']

如果您想要bar如果foo['key']不存在或包含falsey值,则默认值为bar = foo.get('key') or 'foobar' ,这将是Pythonic的方法:

{{1}}

答案 3 :(得分:1)

这是使用bool()

的问题
one = {"my_key": None}

print "Get:", one.get("my_key")
print "Bool:", bool(one.get("my_key"))
print "Get with falback:", one.get("my_key", "other")

Get: None
Bool: False
Get with falback: None

请注意,其中有一个值None,但bool的计算结果为false。你应该使用get("key", "default"),它是为了完成这项工作而设计的。

答案 4 :(得分:1)

如果您认为foo = dict(key=u"")会生成一个字典,其默认值为空字符串,那么您就错了。您需要defaultdict

In [6]: bool(foo['key']) or 'foobar'
Out[6]: 'foobar'
In [7]: foo = dict(key='')
In [9]: bool(foo['nokey']) or 'foobar'
KeyError: 'nokey'

使用defaultdictdict.get,甚至是dict.setdefault

好的方式也有效:

In [10]: try:
   ....:     v = foo['nokey']
   ....: except KeyError:
   ....:     v = 'foobar'
   ....:     

In [11]: v
Out[11]: 'foobar'

答案 5 :(得分:0)

是:

foo.get('key', 'foobar')总是返回一些内容(如果有一个键名'key',它将返回其值,如果没有这样的键,它将返回'foobar'。

但如果没有名为“key”的密钥,则bool(foo['key']) or 'foobar'可以引发KeyError

此外 - 此处or的使用并非指示性,因此get方法更为可取。