Как установить значение по умолчанию для всех ключей объекта dict в python? - PullRequest
50 голосов
/ 04 февраля 2012

Я знаю, что вы можете использовать setdefault (ключ, значение), чтобы установить значение по умолчанию для данного ключа, но есть ли способ установить значения по умолчанию всех ключей на какое-то значение после создания dict?

Putиначе я хочу, чтобы dict возвращал указанное значение по умолчанию для каждого ключа, который я еще не установил.

Ответы [ 7 ]

93 голосов
/ 04 февраля 2012

Вы можете заменить свой старый словарь на 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
8 голосов
/ 28 февраля 2012

Использовать defaultdict

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']
6 голосов
/ 04 февраля 2012

В случае, если вы действительно имеете в виду то, что вы, похоже, спрашиваете, я предоставлю этот альтернативный ответ.

Вы говорите, что хотите, чтобы dict возвращал указанное значение, вы не говорите, что хотите установить это значение в то же время, как 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
2 голосов
/ 04 февраля 2012

Это то, что вы хотите:

>>> 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
1 голос
/ 30 апреля 2014

Вы можете использовать следующий класс.Просто измените ноль на любое значение по умолчанию, которое вам нравится.Решение было протестировано в 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)
1 голос
/ 04 февраля 2012

defaultdict может сделать что-то подобное для вас.

Пример:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['new'].append(10)
>>> d
defaultdict(<class 'list'>, {'new': [10]})
1 голос
/ 04 февраля 2012

Не после создания, нет. Но вы могли бы использовать defaultdict во-первых, который устанавливает значения по умолчанию при его инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...