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 шт):
res = dict()
for key, value in arr.items():
for key2 in value:
res[key2] = res.get(key2, []) + [key]
надо пройтись по всем ключам словаря 1,
у каждого ключа словаря 1 пройтись по всем значениям
каждое значение - это ключ для словаря 2
ключ из словаря 1 добавляем в словарь 2 как значение
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']}
Для начала пишем это
этот код ожидает:
- у вас всегда список в англ-лат. словаре
- вас устроят одноэлементные списки в ответе (например,
'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)
Как скомбинировать выполнение условий, надеюсь, разберетесь.