#python #dictionary #operators
#python #словарь #операторы
Вопрос:
У меня есть некоторые правила, сохраненные в базе данных mysql.
---- --------- ------- ---------- ------- -------
| id | rule_id | field | operator | value | order |
---- --------- ------- ---------- ------- -------
| 1 | 1 | 5 | 2 | 8 | 1 |
| 2 | 1 | 10 | 2 | 2 | 2 |
| 3 | 1 | 4 | 2 | 1 | 3 |
...
# operator 2 is equal to GREATER_THAN for example
Затем я хочу отфильтровать список данных, используя соответствующий оператор правила, как показано в приведенном ниже коде
operator = "LESS_THAN" # get from mysql db
target_value = 8
list1 = [{'clicks':5, "views":7, 'id':1234}, {'clicks':5, "views":9, 'id':1235}]
filtered_list = [i['id'] for i in filter(lambda item: item['views'] > target_value, list1)]
# filter the list according to operator > ,target_value 8 for example.
Возможно ли использовать отношение карты, подобное
operation_map = {
"LESS_THAN" : <,
"GREATER_THAN": >,
"EQUAL":=
}
чтобы вместо if operator == 'GREATER_THAN' : pass
синтаксиса получилось что-то вроде приведенного ниже?
filtered_list = [i['id'] for i in filter(lambda item: item['views'] operation_map[operator] target_value, list1)]
Любая помощь или понимание были бы с благодарностью приняты, большое спасибо.
Комментарии:
1. Зачем вам это нужно? операторы более удобочитаемы, и если объекты вашего класса их реализовали, вы можете использовать просто лямбда-функцию для их сортировки.
Ответ №1:
Используйте operator
модуль:
import operator
operator_map = {'LESS_THAN': operator.lt,
'GREATER_THAN': operator.gt,
'EQUAL': operator.eq}
filtered_list = [i['id'] for i in filter(lambda item: operator_map[operator](item['views'], target_value), list1)]
При необходимости добавляйте другие операторы.