python / django list.reverse()和reverse(list)

时间:2012-05-01 08:06:34

标签: python django list

今天我在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

5 个答案:

答案 0 :(得分:4)

当你这样做时

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

实际上意味着

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

因此,如果结果是意外的,只需在Python中反转

list(reversed(values_list))

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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]

答案 3 :(得分: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))

答案 4 :(得分:0)

尽管这里的其他解决方案在大多数情况下都是正确的,但是使用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