【问题标题】:python/django list.reverse() and reversed(list)python/django list.reverse() 和 reversed(list)
【发布时间】:2012-05-01 08:06:33
【问题描述】:

我今天在我的 django 控制台中尝试了这个,我得到了两个不同的结果。我认为list.reverse() 颠倒了列表(即第一个对象变为最后一个对象,依此类推)[1]。然而,情况似乎并非如此。

>>> from django.db.models import Q
>>> q1 = Q(result=1)
>>> q2 = Q(result=-1)
>>> q3 = q1 | q2
>>> form = UserData.objects.filter(user=user).filter(coins__gt=0).filter(q3).order_by('-modified', '-placed').values_list('result', flat=True)[:10]
>>> form
Out[14]: [-1, -1, -1, -1, -1, 1, -1, 1, -1, -1]
>>> form.reverse()
Out[15]: [1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
>>> form_bw = []
>>> for f in reversed(form):
...     form_bw.append(f)
...     
>>> form_bw
Out[18]: [-1, -1, 1, -1, 1, -1, -1, -1, -1, -1]

我做错了什么?显然我想要的是form_bw

[1]http://docs.python.org/tutorial/datastructures.html

【问题讨论】:

  • 您需要先将结果转换为列表。 values_list 实际上并没有给你一个 python 列表。

标签: python django list


【解决方案1】:

当你这样做时

querysert.order_by('-modified', '-placed').reverse()

其实是这样的

querysert.order_by('modified', 'placed')

因此,如果结果出乎意料,只需在 Python 中反转

list(reversed(values_list))

或者您必须检查reverse 带到查询集的排序逻辑。

【讨论】:

    【解决方案2】:

    form 不是一个列表。它是一个 QuerySet,它与列表有很多相似之处,但不是一个。特别是,它定义了一个reverse method,它实际上会返回数据库以相反的顺序请求项目。

    【讨论】:

      【解决方案3】:

      我不是 Django 专家,因此不确定 form 的类型。但是,很明显它不是标准列表:

      >>> form.reverse()
      Out[15]: [1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
      

      内置的list.reverse() 函数返回None,而这个reverse() 函数似乎返回了不同的东西。这让我得出结论,form 不是一个列表。

      尝试以下方法:

      form = list(form)
      form.reverse()
      

      还要注意:

      >>> form_bw = []
      >>> for f in reversed(form):
      ...     form_bw.append(f)
      

      只是一个很长的说法:

      >>> form_bw = list(reversed(form))
      

      【讨论】:

      • 实际上,form = list(form)form.reverse() 确实有效。所以,我猜 django 中的 values_list() 不会返回列表。
      【解决方案4】:

      form 真的是一个列表吗?请注意,list.reverse 不会返回结果,因此您的提示结果看起来很可疑:

      In [1]: lst = [1, 2, 3, 4]
      In [2]: lst.reverse()    # <-- note: no result returned here (~ None)
      In [3]: lst 
      Out[3]: [4, 3, 2, 1]
      In [4]:
      

      另外,作为旁注,使用reversed 的更好方法是:

      In [5]: lst = [1, 2, 3, 4]
      
      In [6]: rev = list(reversed(lst))
      
      In [7]: rev
      Out[7]: [4, 3, 2, 1]
      

      或者,只使用带有负步长的切片:

      In [8]: rev = lst[::-1]
      
      In [9]: rev
      Out[9]: [4, 3, 2, 1]
      

      【讨论】:

        【解决方案5】:

        虽然这里的其他解决方案在大多数情况下都是正确的,但是使用 Django QuerySet 的 values_list,它不起作用。

        唯一的办法是:

        season_ids = matchesByLeague.values_list('season_id', flat=True).distinct()
        season_ids = list(reversed(season_ids))
        
        #Not working
        #season_ids = matchesByLeague.values_list('season_id', flat=True).distinct()
        #season_ids.reverse()
        #season_ids = matchesByLeague.values_list('season_id', flat=True).distinct().reverse()
        #reversed(list(season_ids))
        

        感谢@NPE 和@xpanta

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多