Можно ли использовать карту операторов для автоматической генерации указанного оператора? - PullRequest
0 голосов
/ 22 марта 2019

Поскольку у меня есть некоторые правила, сохраненные в mysql db.

+----+---------+-------+----------+-------+-------+
| 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 голос
/ 22 марта 2019

Используйте модуль 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)]

При необходимости добавьте другие операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...