Синтаксис создания словаря Python - PullRequest
48 голосов
/ 31 мая 2011

Мне интересно, есть ли способ заполнить словарь так, чтобы у вас было несколько ключей, сопоставляющих одно и то же значение, которое менее многословно, чем сказать:

d = {1:'yes', 2:'yes', 3:'yes', 4:'no'}

Я думаю что-то вроде:

d = {*(1,2,3):'yes', 4:'no'}

, что, очевидно, является синтаксической ошибкой.

Есть ли достаточно простой способ сделать это без СЛИШКОМ большого запутывания? (Я не играю в гольф-код, но мне также не нужно писать, по сути, одно и то же снова и снова. Однако, любые ответы, связанные с код-гольфом, также приветствуются, так как код-гольф потрясающий =]).

Редактировать

Я, наверное, выбрал плохой пример. Вот что я пытаюсь сделать:

d = {*('READY', 95): 'GPLR2_95', 'CHARGING': 'GPLR3_99', 'PROTECTION': 'GPLR3_100', 'CONNECTED': 'GPLR3_101', 'ERROR':'GPLR3_102'}

Я ожидаю, что это расширится до:

d = {'READY':'GPLR2_95', 95: 'GPLR2_95', ...}

Edit-> Edit

Я знаю, что это глупо и совершенно не нужно, но моя цель - сделать это в одной строке. Это, очевидно, не должно ограничивать какие-либо ответы и писать код только потому, что он помещается в 1 строку, глупо Но я пишу константу уровня модуля, которую было бы неплохо, если бы это был один лайнер.

Ответы [ 7 ]

66 голосов
/ 31 мая 2011

Вы можете перевернуть его:

>>> d1 = {"yes": [1,2,3], "no": [4]}

и затем "инвертировать" этот словарь:

>>> d2 = {value:key for key in d1 for value in d1[key]}
>>> d2
{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no'}
8 голосов
/ 31 мая 2011

Как насчет:

501 $ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = {"q":1}
>>> print a
{'q': 1}
>>> a["q"]
1
>>> a["r"] = a["s"] = a["t"] = 2
>>> a
{'q': 1, 's': 2, 'r': 2, 't': 2}
>>> 
2 голосов
/ 31 мая 2011
d = {'READY': 'GPLR2_95',
    95: 'GPLR2_95',
    'CHARGING': 'GPLR3_99',
    'PROTECTION': 'GPLR3_100',
    'CONNECTED': 'GPLR3_101',
    'ERROR':'GPLR3_102'}

Что плохого в том, чтобы разбить это на несколько строк (как указано выше)?Точка сохранения набора текста или экономии вертикального пространства?Что-то еще?

Кстати, очень странно иметь ключи, представляющие собой сочетание чисел и строк.

note: Я написал это как ответ, а не каккомментарий, потому что я хотел показать отформатированный код в несколько строк.

2 голосов
/ 31 мая 2011

Код гольфа?

yesindices = [1,2,3,22,34,33]
noindices = [4,8,9]
dict (zip(yesindices, ['yes' for i in yesindices]) + zip(noindices, ['no' for i in noindices]))

урожайность

{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no', 33: 'yes', 8: 'no', 9: 'no', 34: 'yes', 22: 'yes'}
1 голос
/ 31 мая 2011

Для вашего случая

dict([(_, 'yes') for _ in range(1,4)], **{4:'no'})

А если вам нужно несколько клавиш для 'yes' и 'no'

>>> from itertools import chain
>>> dict(chain([(_, 'yes') for _ in range(1,4)], [(_, 'no') for _ in range(4, 10)]))
{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no', 5: 'no', 6: 'no', 7: 'no', 8: 'no', 9: 'no'}

Не так уж и здорово, но работает.

0 голосов
/ 13 августа 2018

Попробуйте перебрать элементы dict.

  • Для Python 2.x

{key: value for key, value in your_dict.iteritems()}

  • Для Python 3.x

{key: value for key, value in your_dict.items()}

0 голосов
/ 31 мая 2011
dict((x, {4: 'no'}.get(x, 'yes')) for x in range(1, 5))

Или в 3.x:

{x: {4: 'no'}.get(x, 'yes') for x in range(1, 5)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...