Вот упрощенная версия вашей проблемы.Вы можете сгруппировать свои AwardsDict
"значения" словарей по NSN
, а затем сравнить и сопоставить.
RFQDict = {
'a': {'Add_method': 'D1', 'NSN': '9905'},
'b': {'Add_method': 'D2', 'NSN': '9906'},
'c': {'Add_method': 'D3', 'NSN': '9907'},
'd': {'Add_method': 'D4', 'NSN': '9908'}
}
AwardsDict = {
'W21': {'Awarddate': '08-13-2007', 'Awardid': '1', 'NSN': '9906'},
'W22': {'Awarddate': '08-14-2007', 'Awardid': '2', 'NSN': '9905'},
'W23': {'Awarddate': '08-15-2007', 'Awardid': '3', 'NSN': '9908'},
'W24': {'Awarddate': '08-16-2007', 'Awardid': '4', 'NSN': '9907'},
}
# First create a new dictionary with "NSN" as keys and awards as matches
nsn_awards = {v['NSN']: v for v in AwardsDict.values()}
# go through all values of RFQDict and find a match by
# looking up the its NSN in the nsn_awards_dict
matches = [(rfq, nsn_awards[rfq['NSN']]) for rfq in RFQDict.values()]
print(matches)
печатает:
[({'NSN': '9908', 'Add_method': 'D4'}, {'NSN': '9908', 'Awardid': '3', 'Awarddate': '08-15-2007'}), ({'NSN': '9907', 'Add_method': 'D3'}, {'NSN': '9907', 'Awardid': '4
', 'Awarddate': '08-16-2007'}), ({'NSN': '9906', 'Add_method': 'D2'}, {'NSN': '9906', 'Awardid': '1', 'Awarddate': '08-13-2007'}), ({'NSN': '9905', 'Add_method': 'D1'}
, {'NSN': '9905', 'Awardid': '2', 'Awarddate': '08-14-2007'})]
Обратите внимание, что это дает нам O (n) решение, но компромисс - это место для диктата, который мы создаем.
Если есть вероятность, что у вас могут быть NSN, у которых нет совпадения в AwardsDict
, вы можете выполнить простой if nsn in nsn_awards
проверьте перед созданием совпадения.Чтобы объяснить это лучше, вот версия без списочных представлений:
matches = []
for rfq in RFQDict.values():
if rfq['NSN'] in nsn_awards: # only append if there's a match
nsn = rfq['NSN']
matches.append((rfq, nsn_awards[nsn]))