Python 列表与位运算
有没有办法把一堆 Django 查询表达式(比如 Q(first_name="Jordan")
,其中 Q
是 django.db.models.Q
)用位运算符 OR 连接起来呢?
换句话说,我现在有这样的东西:
search_string = "various search terms"
我想要做的是:
search_params = [Q(description__icontains=term) for term in re.split(r'\W', search_string)]
search_params = something_magical(search_params)
results = Record.objects.filter(search_params)
在这里,search_params
现在相当于 Q(description__icontains="various") | Q(description__icontains="search") | Q(description__icontains="terms")
我知道可以用这样的函数来实现:
def something_magical(lst):
result = lst[0]
for l in lst[1:]
result |= l
return result
所以我在想,这种功能是不是已经在 Python 里内置了(我猜它的效率会比我写的函数更高)。
虽然我对这个应用感兴趣,但我其实也只是从理论上想了解一下。
1 个回答
19
你可能想要这样做:
import operator
from functools import reduce # Python 3
search_params = reduce(operator.or_, search_params, Q())
这段代码会在search_params
中的所有项目之间加上一个位运算符或(|
),一开始是用一个空的条件Q()
。