Можно ли сразу назначить одно и то же значение нескольким клавишам в объекте 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)
}