tags = ["school", "hollywood"]
tagsLambda = lambda post: (
eval('|'.join(
[r'(post["tags"].contains("' + tag + '"))' for tag in tags]
))
)
d = r.db("test").table("posts").filter(tagsLambda).run()
[ r'post["tags"].contains("' + tag + '")' for tag in tags ]
- это понимание списка. Он создает список строк, таких как (post["tags"].contains("school"))
, для каждого тега в тегах. Операция '|'.join
строит строку из списка строк с '|' между ними, как (post["tags"].contains("school")) | (post["tags"].contains("hollywood"))
. eval оценивает всю строку.
Приведенный выше код можно упростить, используя reduce
как
tags = ["school", "hollywood"]
tagsLambda = lambda post:
reduce(lambda x,y: x | y, [ post["tags"].contains(tag) for tag in tags])
d = r.db("test").table("posts").filter(tagsLambda).run()
Для Python 3 необходимо импортировать functools, чтобы использовать reduce
и заменить reduce
на functools.reduce
.
Вторую лямбду можно заменить функцией.
import operator as op
reduce(op.or_, [ post["tags"].contains(tag) for tag in tags])
Пользовательские генераторы для лучшего результата.
reduce(op.or_, ( post["tags"].contains(tag) for tag in tags))
person
Nizam Mohamed
schedule
09.02.2015