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
as 来简化
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
.
第二个 lambda 可以用函数替换。
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))