gpt4 book ai didi

python - 使用有值(value)的过滤器确定对象的优先级

转载 作者:行者123 更新时间:2023-11-29 12:03:54 25 4
gpt4 key购买 nike

我有一个有趣的编程问题,我确信它有很多非常有趣的解决方案,我希望有人对我可以采取的好的方向有一些见解。

我在 Django 工作,我有一个 QuerySet 对象和一组过滤器。我想找到在所有过滤器中幸存下来的对象子集,但这并不总是可能的,所以我想对查询集进行排序,以便在最重要的过滤器中幸存下来的对象排在总是被过滤掉的对象之前。我为每个过滤器定义了一个重要性级别。

因此,在抽象层面上,给定一组对象和一组加权约束,我想要一个按对象达到的权重排序的对象列表。

例如,给定一组单词:

{'Almond', 'Red', 'Apple', 'Gargle', 'Anyone'}

还有一组有值(value)的过滤器:

- Starts with A, worth 10 points

- Ends with E, worth 5 points

- 6 letters long, worth 3 points

返回以下数组,以及相关的分数:

[['Anyone',18],['Apple',15],['Almond', 13],['Gargle',8],['Red',0]]

由于这些是 Django 中的对象和过滤器,我还想尽可能使用查询集函数而不是循环来改进运行时间和复杂性(我使用的是 PostgreSQL,因此任何特定于 PostgreSQL 的解决方案都可以)。所以基本上,如果我有 n 个对象和 f 个过滤器,我想实现比 O(nf+nlogn) 更好的复杂性,或者至少优化 Django 的解决方案。

最佳答案

from django.db.models import CharField, IntegerField, Case, When, Q
from django.db.models.functions import Length

# You can register function as a transform
CharField.register_lookup(Length, 'length')

filters = [
(Q(name__startswith='A'), 10),
(Q(name__endswith='E'), 5),
(Q(name__length=6), 3),
]

Item.objects.annotate(
# sum, not Sum
tot_score=sum(Case(When(filter, then=score),
default=0,
output_field=IntegerField())
for filter, score in filters)
).values_list('name', 'tot_score').order_by('-tot_score')

Conditional Expressions .

关于python - 使用有值(value)的过滤器确定对象的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38340083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com