Python列表转换为位运算

10

有没有一种方法可以将Django查询表达式列表(如Q(first_name="Jordan"),其中Qdjango.db.models.Q)进行位或运算?

换句话说,我有像这样的东西:

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中(我假设它比我的函数更加优化)。

虽然我对它在这个应用程序中很感兴趣,但我也对它理论上的应用很感兴趣。


我不认为有这样的Django运算符...但是你可以执行所有“or”查询,然后使用Python集合运算符结合结果。(http://docs.python.org/library/sets.html#set-objects) - Richard Green
@RichardGreen 可以创建相当丑陋的查询。 - Jordan Reiter
1个回答

19

你可能想要

import operator 
from functools import reduce    # Python 3
search_params = reduce(operator.or_, search_params, Q())

这将在search_params中的所有项目之间放置一个按位或(|),从空条件Q()开始。


不错!这样的东西让我越来越爱 Python。 - Josh Smeaton
刚刚花了一点时间玩 reducemap - Jordan Reiter
很好,你喜欢它!那么你可能也会喜欢itertools - Jan Pöschko
非常聪明。不知道运算符可以作为函数使用。 - Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接