В 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) синтаксис, такой как:
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?
Я бы сказал, что то, что у вас есть, очень просто, вы могли бы немного улучшить его до:
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
Это, конечно, вернет первое встреченное значение, ключ для которого содержит заданный элемент.
Почему бы не наследоваться от 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}
но я предпочитаю решение с циклом
Ваш первый пример можно упростить, используя цикл:
myDict = {}
for key in ['a', 'c', 'd']:
myDict[key] = 10
for key in ['b', 'e']:
myDict[key] = 20
Никакого специализированного синтаксиса или хитростей, и я не могу придумать ничего, что было бы проще для понимания.
Что касается вашего второго вопроса, то нет простого и эффективного способа выполнить поиск, как в вашем втором примере. Мне приходит в голову только итерация по ключам (кортежам) и проверка наличия ключа в любом из них, а это не то, что вам нужно. Придерживайтесь использования прямого dict с нужными вам ключами.
В целом, если вы стремитесь к тому, чтобы код был понятен новичкам, придерживайтесь основ, таких как условия if и циклы for/while.