在 rethinkdb 的 python 中使用 lambda 的多个过滤器?
Multiple filter using lambda in python on rethinkdb?
我正在尝试过滤 table 中的数组对象。这是我过滤后完美运行的案例。
tags = ["school", "hollywood"]
tagsLambda = lambda post: (post["tags"].contains(tags[0])) | (post["tags"].contains(tags[1]))
d = r.db("test").table("posts").filter(
tagsLambda
).run()
但是,我的问题是我手动执行 lambda 操作,而不是我希望 tagsLambda
过滤所有 tags
。我该怎么做?
我认为你应该可以这样做:
tags = ["school", "hollywood"]
r.db("test").table("posts").filter(
lambda post: post["tags"].contains(lambda tag:
r.expr(tags).contains(tag)
)
).run(conn)
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
。
第二个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))
我正在尝试过滤 table 中的数组对象。这是我过滤后完美运行的案例。
tags = ["school", "hollywood"]
tagsLambda = lambda post: (post["tags"].contains(tags[0])) | (post["tags"].contains(tags[1]))
d = r.db("test").table("posts").filter(
tagsLambda
).run()
但是,我的问题是我手动执行 lambda 操作,而不是我希望 tagsLambda
过滤所有 tags
。我该怎么做?
我认为你应该可以这样做:
tags = ["school", "hollywood"]
r.db("test").table("posts").filter(
lambda post: post["tags"].contains(lambda tag:
r.expr(tags).contains(tag)
)
).run(conn)
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
。
第二个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))