【问题标题】:Producing a list by summing results of 'values_list' in Django queryset通过在 Django 查询集中对“values_list”的结果求和来生成一个列表
【发布时间】:2017-04-18 04:39:19
【问题描述】:

通过 Django 查询集调用,我正在生成一个整数元组列表:

[(0,1),(0,2),(0,4),(5,8),.......]

我需要生成一个列表,将元组中的两个元素加在一起,即

[1,2,4,13,.....]

如何在 Django 查询集查询中完成该操作?

到目前为止我写的查询是:

photos_score_list = Photo.objects.filter(upload_time__gte=yesterday).annotate(unique_comments=Count('photocomment__submitted_by', distinct=True)).values_list('vote_score','unique_comments')

【问题讨论】:

    标签: python django


    【解决方案1】:

    我不知道 Django,但是当你有这个时:

    l = [(0,1),(0,2),(0,4),(5,8)]
    

    您可以使用列表推导计算一行中每个元素的总和:

    l2 = [sum(x) for x in l]
    

    结果:

    [1, 2, 4, 13]
    

    适用于您的问题:

    photos_score_sum = [sum(x) for x in Photo.objects.filter(upload_time__gte=yesterday).annotate(unique_comments=Count('photocomment__submitted_by', distinct=True)).values_list('vote_score','unique_comments')]
    

    【讨论】:

    • 有意思,等一下,我试试看。
    • 如果这个优雅的解决方案不适用于 Django 查询集查询,也许 functools.reduceoperator.add 可以提供帮助?参照。这里有一个不同的问题(IN/or):stackoverflow.com/questions/20177749/…
    • 如果它像 Django 中的 querydict 那么你可能需要先调用list()
    • 不确定是否需要,但您也可以使用 map(),因为 Python 3 中的 map 返回一个迭代器。所以map(sum, l).
    • 使用map时必须转换为list,所以listcomps在python 3中绝对占上风。我已经停止使用mapfilter
    【解决方案2】:

    一旦你有了那个元组列表,你就可以使用列表推导来生成你的第二个列表,如下所示:

    >>> tuples_list = [(0,1),(0,2),(0,4),(5,8)]
    >>> res_list = [i+j for i,j in tuples_list]
    >>> res_list
    [1, 2, 4, 13]
    

    在我们的列表理解中,我们返回 tuples_list 中的元组 (i,j)i+j,结果在 res_list 中排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多