0

Синтаксис создания словаря в Python

9

Я wondering, есть ли способ создать словарь так, чтобы несколько ключей ссылались на одно и то же значение, который менее многословен, чем, скажем:

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

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

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

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

Существует ли reasonably simple метод сделать это без слишком большого запутывания? (Я не играю в код-гольф, но мне не нужно писать по сути одно и то же опять и опять. Тем не менее, любые ответы, связанные с код-гольфом, также будут приветствоваться, поскольку код-гольф - это здорово =]).

Правка:

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

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

Я ожидал, что это развернется в:

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

Правка->Правка:

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

5 ответ(ов)

0

Вы можете сделать это следующим образом:

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

Затем "инвертируйте" этот словарь:

d2 = {value: key for key in d1 for value in d1[key]}

В результате вы получите:

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

Таким образом, значения из исходного словаря становятся ключами, а ключи — значениями.

0

Вы можете использовать следующий код на Python:

>>> 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}

В этом примере вы создаете словарь a с одной парой ключ-значение, а затем добавляете несколько новых ключей ("r", "s", и "t"), которым присваивается одно и то же значение 2. В результате, ваш словарь теперь содержит четыре пары ключ-значение. Если есть дополнительные вопросы, не стесняйтесь задавать!

0

Ваш код уже довольно короткий, но если целью является сокращение до минимума (code golf), можно сделать его еще компактнее. Попробуйте следующий вариант:

y=[1,2,3,22,34,33];n=[4,8,9];d=dict(zip(y,'y'*len(y))+zip(n,'n'*len(n)))

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

{1: 'y', 2: 'y', 3: 'y', 4: 'n', 8: 'n', 9: 'n', 22: 'y', 33: 'y', 34: 'y'}

Обратите внимание, что вместо 'yes' и 'no' я использовал 'y' и 'n', так как это сокращает код. Если же необходимо сохранить полные слова, тогда такой сжатий не получится.

0

В вашем примере создания словаря с использованием распаковки — действительно, это более лаконичный и интуитивно понятный способ, чем инверсия словаря. Вот разбор вашего кода:

d = {
    **{k: 'yes' for k in [1, 2, 3]},
    **{k: 'no' for k in [4]}
}

Здесь вы создаете два временных словаря: первый словарь содержит ключи 1, 2, и 3 с значением 'yes', а второй словарь содержит ключ 4 со значением 'no'. Затем вы с помощью распаковки объединяете эти два словаря в один.

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

Хорошая практика!

0

Ваша запись словаря, разделённая на несколько строк, абсолютно корректна и является стандартной практикой в Python. Это улучшает читаемость кода, особенно когда у вас много пар "ключ-значение". Разделение на строки позволяет легче воспринимать структуру данных и быстро находить нужные элементы.

Отвечая на ваш вопрос о том, почему стоит разбивать код на строки: это помогает сэкономить вертикальное пространство и облегчить редактирование. В конечном итоге выбор между экономией набора текста и экономией места будет зависеть от личных предпочтений и контекста использования. Однако важно помнить, что обращение к ключам — это еще одна причина, по которой можно предпочесть более чёткое форматирование.

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

Если у вас есть другие вопросы или нужны разъяснения по данной теме, не стесняйтесь задавать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь