簡體   English   中英

在rethinkdb上的python中使用lambda進行多重過濾?

[英]Multiple filter using lambda in python on rethinkdb?

我正在嘗試過濾表內的數組對象。 在這種情況下,我進行了過濾,效果很好。

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)

參見http://rethinkdb.com/api/python/contains/

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 ]是一個列表[ r'post["tags"].contains("' + tag + '")' for tag in tags ] 它為標簽中的每個標簽構建字符串列表,如(post["tags"].contains("school")) '|'.join操作使用'|'從字符串列表中構建一個字符串 在它們之間(post["tags"].contains("school")) | (post["tags"].contains("hollywood")) (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並用functools.reduce替換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))  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM