Python';s collections.defaultdict正确返回默认值,除非该键为';我没有先引用
基本上,如果我设置一个Python';s collections.defaultdict正确返回默认值,除非该键为';我没有先引用,python,python-3.x,dictionary,collections,Python,Python 3.x,Dictionary,Collections,基本上,如果我设置一个defaultdict并按键引用它,它将正常工作并返回我设置为默认值的值。但是,如果在其上使用.get(),则不会返回默认值。这是我能举的最简单的例子 basedict = defaultdict(dict) assert(basedict['junk'] == {}) # Pass assert(basedict.get('junk') == {}) # Pass assert(basedict.get('popcorn') == {}) # Fail 最后,我使用的
defaultdict
并按键引用它,它将正常工作并返回我设置为默认值的值。但是,如果在其上使用.get()
,则不会返回默认值。这是我能举的最简单的例子
basedict = defaultdict(dict)
assert(basedict['junk'] == {}) # Pass
assert(basedict.get('junk') == {}) # Pass
assert(basedict.get('popcorn') == {}) # Fail
最后,我使用的是dicts of 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
defaultdict.get()。这同样适用于成员资格测试:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> 'foo' in d
False
>>> d['foo']
{}
>>> 'foo' in d
True
如果您需要调用默认工厂以查找缺少的密钥,请使用defaultdict.\uuuu getitem\uuuu
(例如defaultdict\u实例[key]
)
如果需要设置出厂设置以外的默认值,请使用:
注意,我链接了.get()
调用;如果缺少第一个键,则第一个.get()
将返回一个空字典。defaultdict.get()
不填充键,不。这是设计上的,否则将无法达到该方法的目的。这同样适用于成员资格测试:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> 'foo' in d
False
>>> d['foo']
{}
>>> 'foo' in d
True
如果您需要调用默认工厂以查找缺少的密钥,请使用defaultdict.\uuuu getitem\uuuu
(例如defaultdict\u实例[key]
)
如果需要设置出厂设置以外的默认值,请使用:
注意,我链接了.get()
调用;如果第一个键丢失,第一个.get()
将返回一个空字典。我最近遇到了这个问题,基本上必须这样做:
from collections import defaultdict
class BetterDict(defaultdict):
def get(self, item, default=None):
# default is not really used, but leaving here for compatibility
# This will either return the actual value, or the defaultdict's
# default, as generated by default_factory
return self.__getitem__(item)
现在:
basedict = BetterDict(dict)
assert(basedict['junk'] == {}) # Pass
assert(basedict.get('junk') == {}) # Pass
assert(basedict.get('popcorn') == {}) # Pass
我最近遇到了这个问题,基本上不得不这样做:
from collections import defaultdict
class BetterDict(defaultdict):
def get(self, item, default=None):
# default is not really used, but leaving here for compatibility
# This will either return the actual value, or the defaultdict's
# default, as generated by default_factory
return self.__getitem__(item)
现在:
basedict = BetterDict(dict)
assert(basedict['junk'] == {}) # Pass
assert(basedict.get('junk') == {}) # Pass
assert(basedict.get('popcorn') == {}) # Pass
没有解决我的问题,但帮助我找到了解决方案。因此,我将其标记为已接受的解决方案。@StackOfPanakes您的解决方案是什么?我在问题的“更新”部分发布了我的解决方案。基本上用try/except块包装它来处理没有钥匙的情况。@StackofPancakes:那时你只需要weights.get('player',{}).get(队友,0)
。根本不需要设置默认值。@StackofPancakes:我回滚了更新;请随意发布您自己的答案帖子。答案放在答题帖上,而不是问题帖上。这并不能解决我的问题,但能帮助我找到解决方案。因此,我将其标记为已接受的解决方案。@StackOfPanakes您的解决方案是什么?我在问题的“更新”部分发布了我的解决方案。基本上用try/except块包装它来处理没有钥匙的情况。@StackofPancakes:那时你只需要weights.get('player',{}).get(队友,0)
。根本不需要设置默认值。@StackofPancakes:我回滚了更新;请随意发布您自己的答案帖子。答案放在答题帖上,而不是问题帖上。