Подтвердить что ты не робот

Как установить значение по умолчанию для всех ключей объекта dict в python?

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

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

4b9b3361

Ответ 1

Вы можете заменить старый словарь 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

Ответ 2

Если вы на самом деле имеете в виду то, что вы, кажется, задаете, я предоставлю альтернативный ответ.

Вы говорите, что хотите, чтобы 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

Ответ 3

Использовать 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']

Ответ 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, который устанавливает значения по умолчанию при его инициализации.

Ответ 6

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

Пример:

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

Ответ 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)