Можно ли сразу назначить одно и то же значение нескольким клавишам в объекте dict?

В Python мне нужен объект словаря, который выглядит так:

{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20}

Мне удалось добиться этого, объединив функции dict.update() и dict.fromkeys() следующим образом:

myDict = {}
myDict.update(dict.fromkeys(['a', 'b', 'c'], 10))
myDict.update(dict.fromkeys(['b', 'e'], 20))

Однако, поскольку код написан для начинающих пользователей, которым иногда нужно добавлять ключи/значения, я бы предпочел простой синтаксис с голубыми костями (Perl-like), например:

myDict = {}
myDict['a', 'c', 'd'] = 10
myDict['b', 'e'] = 20

Это, однако, дает мне:

myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20}

Можно ли упростить мой первый пример (используя dict.update() и dict.fromkeys()) дальше и получить объект dict, который я ищу?

Или, наоборот, если у меня есть dict с кортежами, как в моем втором примере, есть ли простой способ для меня выполнить поиск, например myDict['c'] или myDict.get('c'), и получить значение 10?

Ответ 1

Я бы сказал, что у вас очень просто, вы можете немного улучшить его:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10)
my_dict.update(dict.fromkeys(['b', 'e'], 20))

Если ваши ключи имеют кортеж, вы можете сделать:

>>> my_dict = {('a', 'c', 'd'): 10, ('b', 'e'): 20}
>>> next(v for k, v in my_dict.items() if 'c' in k)      # use .iteritems() python-2.x
10

Это, конечно, вернет первое найденное значение, ключ, для которого содержит данный элемент.

Ответ 2

Почему бы не наследовать от dict?

class LazyDict(dict):
    def keylist(self, keys, value):
        for key in keys:
            self[key] = value

>>> d = LazyDict()
>>> d.keylist(('a', 'b', 'c'), 10)
>>> d
{'a': 10, 'c': 10, 'b': 10}

но я предпочитаю решение петли

Ответ 3

Ваш первый пример можно упростить с помощью цикла:

myDict = {}
for key in ['a', 'c', 'd']:
    myDict[key] = 10
for key in ['b', 'e']:
    myDict[key] = 20

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

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

В целом, если вы нацелены на код, который может быть понят новичками, придерживайтесь основ, таких как условия и для циклов/while.

Ответ 4

Подобно @SilentGhost, но более явный синтаксис я предпочитаю:

myDict = {
  **dict.fromkeys(['a', 'b', 'c'], 10), 
  **dict.fromkeys(['b', 'e'], 20)
}