Синтаксис создания словаря в Python
Я 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 ответ(ов)
Вы можете сделать это следующим образом:
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'}
Таким образом, значения из исходного словаря становятся ключами, а ключи — значениями.
Вы можете использовать следующий код на 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
. В результате, ваш словарь теперь содержит четыре пары ключ-значение. Если есть дополнительные вопросы, не стесняйтесь задавать!
Ваш код уже довольно короткий, но если целью является сокращение до минимума (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', так как это сокращает код. Если же необходимо сохранить полные слова, тогда такой сжатий не получится.
В вашем примере создания словаря с использованием распаковки — действительно, это более лаконичный и интуитивно понятный способ, чем инверсия словаря. Вот разбор вашего кода:
d = {
**{k: 'yes' for k in [1, 2, 3]},
**{k: 'no' for k in [4]}
}
Здесь вы создаете два временных словаря: первый словарь содержит ключи 1, 2, и 3 с значением 'yes', а второй словарь содержит ключ 4 со значением 'no'. Затем вы с помощью распаковки объединяете эти два словаря в один.
Такой подход не только короче, но и лучше читается, потому что сразу видно, какие ключи для каких значений вы назначаете, без необходимости делать дополнительные операции.
Хорошая практика!
Ваша запись словаря, разделённая на несколько строк, абсолютно корректна и является стандартной практикой в Python. Это улучшает читаемость кода, особенно когда у вас много пар "ключ-значение". Разделение на строки позволяет легче воспринимать структуру данных и быстро находить нужные элементы.
Отвечая на ваш вопрос о том, почему стоит разбивать код на строки: это помогает сэкономить вертикальное пространство и облегчить редактирование. В конечном итоге выбор между экономией набора текста и экономией места будет зависеть от личных предпочтений и контекста использования. Однако важно помнить, что обращение к ключам — это еще одна причина, по которой можно предпочесть более чёткое форматирование.
Что касается смешивания строковых и числовых ключей, то это может вызвать путаницу в будущем, особенно при работе с такими словарями. Использование однородного типа ключей (либо все строки, либо все числа) сделает ваш код более понятным и предсказуемым. Если это возможно, стоит рассмотреть возможность использования одного типа ключей для повышения однородности и ясности.
Если у вас есть другие вопросы или нужны разъяснения по данной теме, не стесняйтесь задавать!
Однострочное выражение if-then-else
Преобразование списка словарей в DataFrame pandas
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Что означает оператор /= в Python?