Создание нового словаря на основе двух слов

Имеются два слова:

'охрана'
'оранжевый'

На основе них необходимо создать два словаря (по словарю на каждое слово). Ключ словаря - буква, значение - порядковый номер ключа:

{'о': 1, 'х': 2, 'р': 3, 'а': 6, 'н': 5} 
{'о': 1, 'р': 2, 'а': 3, 'н': 4, 'ж': 5, 'е': 6, 'в': 7, 'ы': 8, 'й': 9}

Далее нужно сформировать третий словарь где ключи это буквы, повторяющиеся в обоих словах, а значения это множество значений повторяющихся букв в исходных словарях:

{'н': {5,4}, 'р': {3, 2}, 'о': {1, 1}, 'а': {6, 3}}

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

a='охрана'
b='оранжевый'
a1={a[i]:i+1 for i in range(len(a))}
print(a1)
b1={b[i]:i+1 for i in range(len(b))}
print(b1)
res1=set()
res2=[]
for i in b1.keys():
    if i in a1.keys():
        res1.add(i)
for i,j in zip(a1,b1):
    if i in b1:
        res2+=[[a1[i]]+[b1[i]]]
print(res1)
print(res2)
res3={i:j for i,j in zip(res1,res2)}
print(res3)

Вывод:

{'о': 1, 'х': 2, 'р': 3, 'а': 6, 'н': 5}
{'о': 1, 'р': 2, 'а': 3, 'н': 4, 'ж': 5, 'е': 6, 'в': 7, 'ы': 8, 'й': 9}
{'а', 'р', 'о', 'н'}
[[1, 1], [3, 2], [6, 3], [5, 4]]
{'а': [1, 1], 'р': [3, 2], 'о': [6, 3], 'н': [5, 4]}

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

Автор решения: Alexey Trukhanov

Ваша ошибка в том, что когда Вы собираете последний словарь res3, Вы с помощью zip пытаетесь делать пары из значений множества (res1), которое, по определению, НЕ упорядочено и списка (res2), который, по определению, упорядочен. Поэтому у Вас каждый запуск программы будет брать буквы из множества в случайном порядке и подставлять к ней пару значений из списка в последовательном порядке. В результате, у Вас каждый запуск программы будут получаться разные словари. Вам надо res1 определить как список, заменить метод .add на метод .append и все получится.

a = 'охрана'
b = 'оранжевый'

a1 = {a[i]:i+1 for i in range(len(a))}
print(a1)

b1 = {b[i]:i+1 for i in range(len(b))}
print(b1)

res1 = []
res2 = []

for i in b1.keys():
    if i in a1.keys():
        res1.append(i)

for i, j in zip(a1, b1):
    if i in b1:
        res2 += [[a1[i]]+[b1[i]]]

print(res1)
print(res2)

res3 = {i:j for i, j in zip(res1, res2)}
print(res3)

Есть еще вопрос, который я озвучил в коментах - в задании сказано, что значениями последнего словаря должны быть множества, а не списки. При этом, в задании явная ошибка, указано множество {1,1}, чего быть не может, так как одинаковых значений в множестве быть не может. Поэтому, возможен результат с множествами, но только не {1,1}, а {1}. Вот так:

res3 = {i:set(j) for i, j in zip(res1, res2)}
→ Ссылка
Автор решения: Швеев Алексей

Простенькое (не оптимальное по производительности) решение от меня:

rA = wordA[::-1]; rB = wordB[::-1]
result = {l: (rA.index(l)+1, rB.index(l)+1) for l in set(wordA) if l in wordB}

Объяснение:

for l in wordA - для всех букв в слове A

if l in wordB - которые в слове B

l: (wordA.index(l)+1, wordB.index(l)+1) - добавить ключ l со значением:

(индекс первого вхождения символа в первом слове, индекс первого вхождения символа во втором слове)

→ Ссылка
Автор решения: Amgarak
str1 = 'охрана'
str2 = 'оранжевый'

def str_to_char_dict(string):
    return {char: index for index, char in enumerate(string, start=1)}

dict1 = str_to_char_dict(str1)
dict2 = str_to_char_dict(str2)

common_keys = dict1.keys() & dict2.keys()
result_dict = {key: {dict1[key], dict2[key]} for key in common_keys}

print(dict1)
print(dict2)
print(result_dict)

Вывод:

{'о': 1, 'х': 2, 'р': 3, 'а': 6, 'н': 5}
{'о': 1, 'р': 2, 'а': 3, 'н': 4, 'ж': 5, 'е': 6, 'в': 7, 'ы': 8, 'й': 9}
{'н': {4, 5}, 'о': {1}, 'а': {3, 6}, 'р': {2, 3}}

[Program finished]
→ Ссылка
Автор решения: Oopss
a='охрана'
b='оранжевый'

set_a=set('охрана')
set_b=set('оранжевый')
res={}
for i in set_a.intersection(set_b):
    pos = []
    pos.append(a.rindex(i) + 1)
    pos.append(b.rindex(i) + 1)
    res[i] = set(pos)

print(res)

{'р': {2, 3}, 'о': {1}, 'н': {4, 5}, 'а': {3, 6}}
→ Ссылка