Как сделать для одного значения несколько ключей в Питоне?
Я хочу, чтобы было несколько названий для одного значения в словаре, в Питоне.
Конечно, можно прописать несколько одинаковых значений с разными ключами, но это долго, и выглядит грязнее.
Вот так примерно:
a = {'a':1, 'b':1, 'd':2, 'c':2}
Сами понимаете долго и муторно писать, а я хотел бы, чтобы написал несколько ключей и присвоил им значение.
Примерно так(это не работает):
a = {('a', 'b'):1, ('d', 'c'):2}
Ответы (5 шт):
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}
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
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
})
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()
создает из этого итератора словарь, который вы хотели.
Исходная задача решается распаковкой:
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']]