Необходимо печатать только ключ с высоким приоритетом в dict, когда поиск значений соответствует нескольким ключам (python)

#python

#python

Вопрос:

Необходимо печатать только КЛЮЧ с наивысшим приоритетом, когда поиск соответствует нескольким значениям dict.

 ERROR_CATEGORIES_TO_SEARCH_1 = {
                "VEHICAL_1" : ['CAR'],
                "VEHICAL_2": ['BIKE'],
        "VEHICAL_3"  : ["TRUCK"],
                "VEHICAL_4" : ['AEROPLANE'],
                "VEHICAL_5" : ['SHIP'],
        "VEHICAL_6"   : ['BOAT'],
                "VEHICAL_7" : ['CART'],
                "VEHICAL_8" : ['CYCLE']
            }
  
 
  prio_list = ['VEHICAL_1', 'VEHICAL_2' , 'VEHICAL_3' , 'VEHICAL_4', 'VEHICAL_5', 'VEHICAL_6','VEHICAL_7', 'VEHICAL_8']
 
 
  res = ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[0], ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[1], 
                                  ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[2], ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[3], ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[4], ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[5] , ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[6], ERROR_CATEGORIES_TO_SEARCH_1.get(prio_list[7]))))))))
  
 MESSAGE_A  = "I bought a new CAR and a BIKE"
MESSAGE_B  = "WOW That SHIP is so huge and beautiful"
MESSAGE_C  = "only mode to travel through hill station is by TRUCK"
MESSAGE_D  = "First will ride on a CYCLE and then by BOAT"
  
 resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_A]
//OUTPUT:: VEHICAL_1, VEHICAL_2

resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_B]
//OUTPUT:: VEHICAL_5

resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_c]
//OUTPUT:: VEHICAL_3

resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_D]
//OUTPUT :: VEHICAL_6, VEHICAL_8
  

Поскольку мне нужно печатать только приоритетные КЛЮЧИ для печати, ниже приведен ожидаемый результат ::

 resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_A]
//OUTPUT:: VEHICAL_1


resultant_key = [key for (key, lst) in ERROR_CATEGORIES_TO_SEARCH_1.items() for ele in lst if ele in MESSAGE_D]
//OUTPUT :: VEHICAL_6
  

Любые предложения по этому поводу были бы полезны

Ответ №1:

Вы можете поместить логику в функцию и использовать оператор return в цикле, чтобы возвращать только первый (т. е. с наивысшим приоритетом) ключ.

 def find_highest(message):
    for key in prio_list:
        for word in ERROR_CATEGORIES_TO_SEARCH_1.get(key, []):
            if word in message:
                return key
  
 >>> for message in (MESSAGE_A, MESSAGE_B, MESSAGE_C, MESSAGE_D):
...     print(find_highest(message))
... 
VEHICAL_1
VEHICAL_5
VEHICAL_3
VEHICAL_6
  

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

1. я новичок в python, могу ли я получить объяснение этого, пожалуйста:: для word в ERROR_CATEGORIES_TO_SEARCH_1.get(key, []):

2. Второй аргумент для dict.get(...) — это значение по умолчанию, которое будет возвращено, если ключ не может быть найден (обычно: None ). Но с пустым списком по умолчанию итерация for word in ... просто продолжает работать (шаги итерации = 0, вместо неудачной итерации, потому что вы не можете выполнить итерацию снова None ). Это то же самое, что вы использовали в своем огромном res = ... заявлении, которое вам вообще не нужно, с изменениями в этом ответе, смотрите Также docs.python.org/3/library/stdtypes.html#dict.get

3. Спасибо, это сбивало с толку :: key, []