Cоздать, на основе англо-латинского словаря, латино-английский словарь

Преобразовать из англо-латинского в латино-английский словарь.

Входные данные (словарь пример):

{"apple" : ['malum', 'omum', 'popula'],
'fruit' : ['baca', 'bacca', 'popum'],
'punishment' : ['malum', 'multa']}

Выходные данные:

{'malum': ['apple','punishment'], 
'pomum': 'apple',  
'popula': 'apple',  
'baca': 'fruit',  
'bacca': 'fruit',  
'popum': 'fruit',
'multa': 'punishment'}

Я понимаю что написал бред... Но всё же, помогите разобраться?

dict_1 = dict({"apple": ['malum', 'omum', 'popula'],
               'fruit': ['baca', 'bacca', 'popum'],
               'punishment': ['malum', 'multa']})
dict_reverse = {}
cancel = False
while not cancel:
    otv = input('>>>>>>>>>> ')
    if otv == 'stop'.lower():
        cancel = True
    for key, val in dict_1.items():
        if type(val) in (list, set):
            dict_reverse[tuple(val)] = key
        elif type(val) is dict:
            dict_reverse[tuple(val.items())] = key
        else:
            dict_reverse[val] = key
    for key, val in dict_reverse.items():
        if otv in val:
            print(*key, sep=', ')
        elif otv in key:
            print(val)

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

Автор решения: Zhihar
res = dict()
for key, value in arr.items():
    for key2 in value:
        res[key2] = res.get(key2, []) + [key]
  • надо пройтись по всем ключам словаря 1,

  • у каждого ключа словаря 1 пройтись по всем значениям

  • каждое значение - это ключ для словаря 2

  • ключ из словаря 1 добавляем в словарь 2 как значение

→ Ссылка
Автор решения: Dmitry
d = {"apple" : ['malum', 'omum', 'popula'],
     'fruit' : ['baca', 'bacca', 'popum'],
     'punishment' : ['malum', 'multa']}

dict_reverse = {}

for key, value in d.items():
    for item in value:
        if dict_reverse.get(item):
            dict_reverse[item].append(key)
        else:
            dict_reverse[item] = [key]

print(dict_reverse)

Проверяется существуют ли в итоговом словаре ключи, типы данных везде list в результирующем словаре

Вывод:

{'malum': ['apple', 'punishment'], 'omum': ['apple'], 'popula': ['apple'], 'baca': ['fruit'], 'bacca': ['fruit'], 'popum': ['fruit'], 'multa': ['punishment']}
→ Ссылка
Автор решения: n1tr0xs

Для начала пишем это
этот код ожидает:

  1. у вас всегда список в англ-лат. словаре
  2. вас устроят одноэлементные списки в ответе (например, 'pomum': ['apple'])
en_lat = {
    "apple" : ['malum', 'pomum', 'popula'],
    'fruit' : ['baca', 'bacca', 'popum'],
    'punishment' : ['malum', 'multa'],
}

lat_en = dict()

for key, val in en_lat.items():
    for word in val:
        lat_en[word] = lat_en.get(word, []) + [key]

print(lat_en)
#{'malum': ['apple', 'punishment'], 'pomum': ['apple'], 'popula': ['apple'], 'baca': ['fruit'], 'bacca': ['fruit'], 'popum': ['fruit'], 'multa': ['punishment']}

Если у вас не всегда списки в англ-лат. словаре, то добавляем проверку на список.

en_lat = {
    "apple" : ['malum', 'pomum', 'popula'],
    'fruit' : ['baca', 'bacca', 'popum'],
    'punishment' : ['malum', 'multa'],
}

lat_en = dict()

for key, val in en_lat.items():
    if isinstance(val, list): # вот эту проверку
        for word in val:
            lat_en[word] = lat_en.get(word, []) + [key]
    else: 
        lat_en[word] = lat_en.get(word, []) + [key]
        
print(lat_en)
#{'malum': ['apple', 'punishment'], 'pomum': ['apple'], 'popula': ['apple'], 'baca': ['fruit'], 'bacca': ['fruit'], 'popum': ['fruit'], 'multa': ['punishment']}

Если вас не устраивают одноэлементные списки в ответе, то добавляем проверку и на это:

en_lat = {
    "apple" : ['malum', 'pomum', 'popula'],
    'fruit' : ['baca', 'bacca', 'popum'],
    'punishment' : ['malum', 'multa'],
}

lat_en = dict()

for key, val in en_lat.items():
    for word in val:
        r = lat_en.get(word)
        if r is None:
            lat_en[word] = key
        elif isinstance(r, list):
            r.append(key)
        elif isinstance(r, str):
            lat_en[word] = [r, key]
        
print(lat_en)
# {'malum': ['apple', 'punishment'], 'pomum': 'apple', 'popula': 'apple', 'baca': 'fruit', 'bacca': 'fruit', 'popum': 'fruit', 'multa': 'punishment'}

А в Python 3.10 для этого можно использовать match-case:

for key, val in en_lat.items():
    for word in val:
        r = lat_en.get(word)
        match r:
            case None:
                lat_en[word] = key
            case str():
                lat_en[word] = [r, key]
            case list():
                r.append(key)

Как скомбинировать выполнение условий, надеюсь, разберетесь.

→ Ссылка