Создание нового словаря на основе двух слов
Имеются два слова:
'охрана'
'оранжевый'
На основе них необходимо создать два словаря (по словарю на каждое слово). Ключ словаря - буква, значение - порядковый номер ключа:
{'о': 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 шт):
Ваша ошибка в том, что когда Вы собираете последний словарь 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
со значением:
(индекс первого вхождения символа в первом слове, индекс первого вхождения символа во втором слове)
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]
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}}