【问题标题】:How to set default value to all keys of a dict object in python?如何为python中dict对象的所有键设置默认值?
【发布时间】:2012-02-26 17:38:03
【问题描述】:

我知道您可以使用 setdefault(key, value) 为给定键设置默认值,但是有没有办法在创建 dict 后将所有键的默认值设置为某个值?

换句话说,我希望 dict 为我尚未设置的每个键返回指定的默认值。

【问题讨论】:

  • 你说的这组“全键”是什么?即使您将自己限制为例如,也有无限数量的潜在密钥。字符串。能举个例子吗?
  • 你可以使用get方法,a.get(k[, x]) a[k] if k in a, else x
  • 一些反方向的帮助:stackoverflow.com/questions/7688453/…
  • @delnan 我想要的是为我尚未设置的每个键获取默认值。
  • 这里太长了,我在这篇研究博客文章中描述了解决方案:persagen.com/2020/03/05/…

标签: python dictionary


【解决方案1】:

不是在创建它之后,不是。但是您可以首先使用defaultdict,它会在您初始化它时设置默认值。

【讨论】:

    【解决方案2】:

    defaultdict 可以为你做类似的事情。

    例子:

    >>> from collections import defaultdict
    >>> d = defaultdict(list)
    >>> d
    defaultdict(<class 'list'>, {})
    >>> d['new'].append(10)
    >>> d
    defaultdict(<class 'list'>, {'new': [10]})
    

    【讨论】:

      【解决方案3】:

      您可以将旧字典替换为defaultdict

      >>> from collections import defaultdict
      >>> d = {'foo': 123, 'bar': 456}
      >>> d['baz']
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      KeyError: 'baz'
      >>> d = defaultdict(lambda: -1, d)
      >>> d['baz']
      -1
      

      这里的“诀窍”是defaultdict 可以用另一个dict 初始化。这意味着 您保留普通dict 中的现有值:

      >>> d['foo']
      123
      

      【讨论】:

      • 有什么方法可以使用get 和类似的方法或结构,如in
      • defaultdict(lambda: -1) 还不够吗? d 是干什么用的?
      • @yiwei 用现有dict 中的值初始化defaultdict。问题是“我希望 dict 为我尚未设置的每个键返回指定的默认值。”这样做的方法是创建一个用旧的dict 初始化的defaultdict
      【解决方案4】:

      这是你想要的吗:

      >>> d={'a':1,'b':2,'c':3}
      >>> default_val=99
      >>> for k in d:
      ...     d[k]=default_val
      ...     
      >>> d
      {'a': 99, 'b': 99, 'c': 99}
      >>> 
      
      >>> d={'a':1,'b':2,'c':3}
      >>> from collections import defaultdict
      >>> d=defaultdict(lambda:99,d)
      >>> d
      defaultdict(<function <lambda> at 0x03D21630>, {'a': 1, 'c': 3, 'b': 2})
      >>> d[3]
      99
      

      【讨论】:

        【解决方案5】:

        如果你的意思是你想问的,我会提供这个替代答案。

        你说你想让字典返回一个指定的值,你不是说你想同时设置那个值,就像defaultdict那样。这将这样做:

        class DictWithDefault(dict):
            def __init__(self, default, **kwargs):
                self.default = default
                super(DictWithDefault, self).__init__(**kwargs)
        
            def __getitem__(self, key):
                if key in self:
                    return super(DictWithDefault, self).__getitem__(key)
                return self.default
        

        这样使用:

        d = DictWIthDefault(99, x=5, y=3)
        print d["x"]   # 5
        print d[42]    # 99
        42 in d        # False
        d[42] = 3
        42 in d        # True
        

        或者,您可以像这样使用标准dict

        d = {3: 9, 4: 2}
        default = 99
        print d.get(3, default)  # 9
        print d.get(42, default) # 99
        

        【讨论】:

          【解决方案6】:

          使用默认字典

          from collections import defaultdict
          a = {} 
          a = defaultdict(lambda:0,a)
          a["anything"] # => 0
          

          这对于像这样的情况非常有用,其中每个键的默认值都设置为 0:

          results ={ 'pre-access' : {'count': 4, 'pass_count': 2},'no-access' : {'count': 55, 'pass_count': 19}
          for k,v in results.iteritems():
            a['count'] += v['count']
            a['pass_count'] += v['pass_count']
          

          【讨论】:

            【解决方案7】:

            您可以使用以下类。只需将零更改为您喜欢的任何默认值。该解决方案在 Python 2.7 中进行了测试。

            class cDefaultDict(dict):
                # dictionary that returns zero for missing keys
                # keys with zero values are not stored
            
                def __missing__(self,key):
                    return 0
            
                def __setitem__(self, key, value):
                    if value==0:
                        if key in self:  # returns zero anyway, so no need to store it
                            del self[key]
                    else:
                        dict.__setitem__(self, key, value)
            

            【讨论】:

              猜你喜欢
              • 2016-01-19
              • 2021-07-26
              • 1970-01-01
              • 1970-01-01
              • 2021-08-24
              • 2016-12-28
              • 2014-01-16
              • 1970-01-01
              • 2020-09-01
              相关资源
              最近更新 更多