Ладно, так... У меня есть некоторые словари ниже, которые не хотят сотрудничать. Словарь "a" представляет данные, хранящиеся в нашей базе данных HR. Словарь "b" представляет данные, хранящиеся в данных AS400 iSeries. ПРИМЕЧАНИЕ. ЭТИ НЕ ИСТИННЫЕ ЦЕННОСТИ. Цель состоит в том, чтобы сопоставить ключ в "a" с ключом в "b", используя по меньшей мере 2 поля, сохраняя при этом возможность ссылаться на ключ.
Чтобы поместить вещи по-другому, после того, как я сопоставил 2 значения, я хочу иметь возможность создать новый словарь, соответствующий ключу к ключу b:
match_dictionary[*key from a*] = (*key from b*)
a.pop(*key from a*)
b.pop(*key from b*)
Здесь код:
import collections
a = {'ada123456' : ('123','adam','jones') , 'jus567890':('567','justin','brady') , 'mul345678':('345','muller','thomas')}
b = {'ADAMJ' : ('123','jones') , 'JBRADY':('justin','brady') , 'THOMASM':('345','muller','thomas')}
if [i for i in [(x[1],x[2]) for x in [a[c] for c in a.keys()]]] in [b[d] for d in b.keys()]:
print('Why won\'t this work?')
if ('justin','brady') in [b[d] for d in b.keys()]:
print('\nthis works though')
if ('justin','brady') in [(x[1],x[2]) for x in [a[c] for c in a.keys()]]:
print('\nthis too')
Я сделал это ключом к списку, если у вас более одного совпадения
new_dict = defaultdict(list)
for b_name, b_values in b.items():
for a_name, a_values in a.items():
intersect = set(a_values).intersection(set(b_values))
if len(intersect) >= 2:
new_dict[a_name].append(b_name)
Но было бы легко изменить его на
new_dict[a_name] = b_name
если хотите. Тогда вам не нужен дефолт по умолчанию.
Это дает:
defaultdict(list,
{'ada123456': ['ADAMJ'],
'jus567890': ['JBRADY'],
'mul345678': ['THOMASM']})
если вы хотите, чтобы нормальный dict
обратно просто обернул его в dict()