как сравнить два словаря в Python - PullRequest
0 голосов
/ 14 октября 2018

Я хочу сравнить два словаря и найти подходящее значение

RFQDict словарь в этом формате

'9905-01-485-2102': {'Add_method': 'Dibbs Extract', 'NSN': '9905-01-485-2102', 'Nomenclature': 'REFLECTOR, INDICATIN', 'RFQ_Date': '10-2-2018', 'RFQ_QTY': ' 4200', 'Time': '2018-10-13 22:19:01'}

AwardsDict словарь в этом формате

'W91WAW07C0023': {'Awarddate': '08-13-2007', 'Awardid': 'W91WAW07C0023', 'Cage': '7A293', 'Deliverynumber': '»', 'NSN': '0001', 'Nomenclature': 'INSTITUTE FOR  ANALYSES', 'PR': '0014447158', 'Price': 'See Award Doc', 'Time': '2018-05-17 17:41:54'}

Я хочу сравнить значения NSN, чтобы увидеть, есть ли совпадение

Я использовал этот скрипт для получения двух словарей

RFQDict = {}
AwardsDict = {}

# Fetch RFQ 

RFQref = db.reference('TestRFQ')

snapshot = RFQref.get()
for key, val in snapshot.items():
    RFQDict[key] = val
    print('{0} => {1}'.format(key, val))


Awardsref = db.reference('DibbsAwards')

dsnapshot = Awardsref.get()
for key, val in dsnapshot.items():
    AwardsDict[key] = val
    print('{0} => {1}'.format(key, val))

print(RFQDict)
print(AwardsDict)

Каждый словарь содержит тысячи ключевых значений.Как я могу сравнить значения NSN?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вот упрощенная версия вашей проблемы.Вы можете сгруппировать свои 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]))
0 голосов
/ 14 октября 2018
if dict1["NSN"]==dict2["NSN"]:
    print("Equal")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...