Python 列表与位运算

10 投票
1 回答
2184 浏览
提问于 2025-04-17 10:29

有没有办法把一堆 Django 查询表达式(比如 Q(first_name="Jordan"),其中 Qdjango.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()

撰写回答