#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.get3. Спасибо, это сбивало с толку :: key, []