Как сделать для одного значения несколько ключей в Питоне?

Я хочу, чтобы было несколько названий для одного значения в словаре, в Питоне.

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

Вот так примерно:

a = {'a':1, 'b':1, 'd':2, 'c':2}

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

Примерно так(это не работает):

a = {('a', 'b'):1, ('d', 'c'):2}

Ответы (5 шт):

Автор решения: Oopss
d2 = dict(zip(('a','b','c','d','e','f','g','h'),(555,666,666,666,777,777,777,999)))
print(d2)

{'a': 555, 'b': 666, 'c': 666, 'd': 666, 'e': 777, 'f': 777, 'g': 777, 'h': 999}
→ Ссылка
Автор решения: Fox Fox
a = {('a', 'b'): 1, ('d', 'c'): 2}

А у Вас ошибка ^2. И не надо делать так, чтоб а было и словарём, и элементом. Моё мнение таково: эта конструкция проблемна, с ней очень проблемно работать будет. Вот проверка работы такого выражения:

a = {('e', 'b'): 1, ('d', 'c'): 2}
# Перебор всех элементов в словаре
for key_tuple in a.keys():
    for element in key_tuple:
        print(f"Значение для {element} - {a[key_tuple]}")

Выводит на экран это:

Значение для e - 1
Значение для b - 1
Значение для d - 2
Значение для c - 2
→ Ссылка
Автор решения: Stanislav Volodarskiy

dict.fromkeys умеет построить словарь из нескольких ключей с одним значением.
| объединяет словари вместе:

a = dict.fromkeys(('a', 'b'), 1) | dict.fromkeys(('c', 'd'), 2)
{'a': 1, 'b': 1, 'c': 2, 'd': 2}

Можно сделать утилиту для сборки словаря:

def build_dict(*pairs):
    d = {}
    for keys, value in pairs:
        d.update(dict.fromkeys(keys, value))
    return d


a = build_dict(
    (('a', 'b'), 1),
    (('c', 'd'), 2)
)

Или так:

def build_dict(pairs):
    d = {}
    for keys, value in pairs.items():
        d.update(dict.fromkeys(keys, value))
    return d


a = build_dict({
    ('a', 'b'): 1,
    ('c', 'd'): 2
})
→ Ссылка
Автор решения: MarianD
keys = "abdc"
values = 1, 1, 2, 2

a = dict(zip(keys, values))

Результат (содержание переменной a):

 {'a': 1, 'b': 1, 'd': 2, 'c': 2}

Объяснение:

zip(keys, values) сделает итератор из пар (а, 1), (b, 1), (d, 2), (c, 2), затем конструктор dict() создает из этого итератора словарь, который вы хотели.

→ Ссылка
Автор решения: Vitalizzare

Исходная задача решается распаковкой:

base_mapping = {('a', 'b'): 1, ('c', 'd'): 2}
data = {k: v for keys, v in base_mapping.items() for k in keys}
print(f'{data = }')

# data = {'a': 1, 'b': 1, 'c': 2, 'd': 2}

Чтобы сохранить связь между элементами слоя, мы можем загрузить соответствующее им значение в контейнер, - dict, list, SimpleNamespace и т.п. - и связать его с ними при распаковке. Если понадобиться, можем восстановить слои по id контейнеров:

from collections import defaultdict
from types import SimpleNamespace     # Container bound to the keys of one layer 
                                      # and storing the corresponding layer value

base_mapping = {('a', 'b'): 1, ('c', 'd'): 2, ('e', 'f'): 1}

# Unpack tuple keys, wrapping their shared value in a container
wrap = lambda x: SimpleNamespace(value=x)
data = {key: wraped_value 
        for layer, wraped_value in zip(
            base_mapping.keys(), map(wrap, base_mapping.values())) 
        for key in layer}

# Add a new alias to the item assigned to the key 'f'  
data['F'] = data['f']

# Change the value of an item assigned to the key 'F'
data['F'].value = 42

# Collect unpacked values into layers that share a common container 
layers = defaultdict(list)
for k, v in data.items():
    layers[id(v)].append(k)
layers = [*layers.values()]

print(f'{data = }')
print(f'{layers = }')
data = {'a': namespace(value=1),
        'b': namespace(value=1), 
        'c': namespace(value=2), 
        'd': namespace(value=2),
        'e': namespace(value=42), 
        'f': namespace(value=42), 
        'F': namespace(value=42)}
layers = [['a', 'b'], ['c', 'd'], ['e', 'f', 'F']]
→ Ссылка