Сравнение значений ключей словаря Python

#python

Вопрос:

У меня есть данные, которые поступают в этом формате:

 reg_data1 = {
    'request_id': 'bc94f069-ea3c-4465-8112-3a236b6ed8ea', 
    'profile_name': '2.0b', 
    'transport_name': 'simpleHttp', 
    'transport_address': 'None', 
    'report_only': False, 
    'xml_signature': False, 
    'ven_name': 'dan_test', 
    'http_pull_model': True
}

reg_data2 = {
    'request_id': 'bc94f069-ea3c-4465-8112-3a236b6ed8ea', 
    'profile_name': '2.0b', 
    'transport_name': 'simpleHttp', 
    'transport_address': 'None', 
    'report_only': False, 
    'xml_signature': False, 
    'ven_name': 'dan_test_asdf', 
    'http_pull_model': True
}
 

Я пытаюсь создать функцию find_ven , чтобы увидеть ven_name VENS , существует ли она, если она существует, возвращает ven_id и regresistration_id еще возвращает False

 # Future db
VENS = {
    "1": {"ven_name": "dan_test", "ven_id": "ven_id_dan_test", "registration_id": "reg_id_dan_test"},
    "2": {"ven_name": "slipstream_ven1", "ven_id": "ven_id_slipstream_ven1", "registration_id": "reg_id_slipstream_ven1"},
    "3": {"ven_name": "volttron_test", "ven_id": "ven_id_volttron_test", "registration_id": "reg_id_volttron_test"}     
}



def find_ven(data):
    print("TRYING TO LOOK UP VEN ",data['ven_name'])
    for values in VENS.values():
        #print(values['ven_name'])
        if (values['ven_name']) in data['ven_name']:
            print(f"found {values['ven_name']} in payload, looking to match {data['ven_name']}")
            #return v['ven_id'],v['registration_id']
            return True
        else:
            return False
 

Может кто-нибудь дать мне подсказку, где я ошибаюсь, так как оба reg_data1 и reg_data2 оба возвращаются True , но reg_data2 должны вернуться False , так как reg_data2 ven_name их не существует VENS . В конечном счете, я пытаюсь использовать find_ven функцию для возврата ven_id amp; registration_id else False

Оба возвращаются True :

 find_ven(reg_data1)
find_ven(reg_data2)
 

Любые советы приветствуются, спасибо

Комментарии:

1. if (values['ven_name']) in data['ven_name']: проблема в том, что он проверяет , является ли 'dan_test' подстрока 'dan_test_asdf' , которая истинна. Замените его, if values['ven_name'] == data['ven_name']: и вы должны быть готовы к работе!

Ответ №1:

То, что утверждали другие, верно, проблема заключалась в использовании in . Но также вам следует рассмотреть возможность переноса return false оператора за пределы цикла for, иначе он никогда не будет повторяться по всем VENS записям.

 def find_ven(data):
     print("TRYING TO LOOK UP VEN ",data['ven_name'])
     for values in VENS.values():
         #print(values['ven_name'])
         if (values['ven_name']) == data['ven_name']:
             print(f"found {values['ven_name']} in payload, looking to match {data['ven_name']}")
             #return v['ven_id'],v['registration_id']
             return True
     return False
 

Ответ №2:

Я сделал ваш код более удобным для чтения, ваша проблема заключалась в использовании in вместо == :

 def find_ven(data):
    print("TRYING TO LOOK UP VEN ",data['ven_name'])
    ven_name = data['ven_name']
    for v in VENS.values():
        #print(values['ven_name'])
        if v.get('ven_name') == ven_name:
            print(f"found {v.get('ven_name')} in payload, looking to match {ven_name}")
            #return v['ven_id'],v['registration_id']
            return True
    return False
 

Комментарии:

1. Спасибо, я нажму зеленую галочку, когда смогу