Sta*_*kes 0 python collections dictionary python-3.x
基本上,如果我设置 adefaultdict并通过键引用它,它将正常工作并返回我设置为默认值的值。但是,如果我.get()在其上使用 a ,则不会返回默认值。这是我可以给出的最简单的例子。
basedict = defaultdict(dict)
assert(basedict['junk'] == {}) # Pass
assert(basedict.get('junk') == {}) # Pass
assert(basedict.get('popcorn') == {}) # Fail
Run Code Online (Sandbox Code Playgroud)
为了完成,我正在使用 dicts 的 dicts 和我最初遇到问题的代码看起来更像这样
from collections import defaultdict
basedict = defaultdict(dict)
assert(basedict['junk'] == {})
basedict[69] = defaultdict(lambda: 1000)
assert(basedict[69]['junk'] == 1000)
assert(basedict[69].get('junk') == 1000)
assert(basedict[69].get('junk', 420) == 1000)
# The above works fine, but if I call .get on a default dict using a key I've
# never referenced before it returns None or the .get supplied default value
assert(basedict[69].get('garbage') == 1000) # Returns None
assert(basedict[69].get('garbage', 420) == 1000) # Returns 420
assert(basedict[69].get('dumpster', 420) == 1000) # Returns 420
# But if I place a an assert before the calling .get(garbage) that
# checks basedict[69]['garbage'] then the asserts after work until I get
# to 'dumpster' at which point it fails again
# It also fails if I set the defaultdict to something other than a lambda
basedict[7] = defaultdict(dict)
assert(basedict[7]['taco'] == {}) # Pass
assert(basedict[7].get('taco') == {}) # Pass
assert(basedict[7].get('burrito') == {}) # Fail
Run Code Online (Sandbox Code Playgroud)
defaultdict.get()不不填充的关键,没有。这是设计使然,否则会破坏该方法的目的。这同样适用于会员测试:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> 'foo' in d
False
>>> d['foo']
{}
>>> 'foo' in d
True
Run Code Online (Sandbox Code Playgroud)
如果您需要为丢失的键调用默认工厂,请使用defaultdict.__getitem__(eg defaultdict_instance[key])。
如果您需要设置一个默认值等比工厂提供,使用dict.setdefault():
>>> d = defaultdict(dict)
>>> d.setdefault('bar', 42)
42
>>> d.setdefault('bar', 30)
42
>>> d
defaultdict(<type 'dict'>, {'bar': 42})
Run Code Online (Sandbox Code Playgroud)
如果您只需要获取默认值,请使用dict.get():
>>> d = defaultdict(dict)
>>> d.get('bar', {}).get('baz', 1000)
1000
Run Code Online (Sandbox Code Playgroud)
请注意,我链接了.get()调用;.get()如果第一个键丢失,第一个返回一个空字典。
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |