Действительно ли возможно присвоить то же значение нескольким ключам в объекте 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) синтаксис, такой как:

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?

44
задан SilentGhost 4 June 2010 в 13:53
поделиться

3 ответа

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

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

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

48
ответ дан 26 November 2019 в 22:06
поделиться

Почему бы не наследоваться от 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}

но я предпочитаю решение с циклом

6
ответ дан 26 November 2019 в 22:06
поделиться

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

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

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

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

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

8
ответ дан 26 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: