Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s collections.defaultdict正确返回默认值,除非该键为';我没有先引用_Python_Python 3.x_Dictionary_Collections - Fatal编程技术网

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:我回滚了更新;请随意发布您自己的答案帖子。答案放在答题帖上,而不是问题帖上。