【问题标题】:Reverse queryset/list, then slice [duplicate]反向查询集/列表,然后切片[重复]
【发布时间】:2019-09-26 19:22:13
【问题描述】:

致标记为重复的人:这不是因为我有一组 2 个特定目标,按特定顺序进行。在另一个问题中,它只需要反转,这稍微简单一些。感谢您抽出宝贵时间阅读。

我有一个 Django 查询集,简单来说,它似乎是列表的扩展(如果我错了,请纠正我)

我需要:

  1. 反转查询集或列表,然后
  2. 对列表进行切片

我这样做的形式是:

return reversed(querySet)[:20]

但是,现在由于某种原因,我收到以下错误:

"'reversed' 对象不可下标"

我可以轻松做到:

return querySet[:20:-1]

但这会导致列表先被切片,然后倒序排列。

因此,我正在寻找实现这一目标的下一个最佳 hacky 方法;

但是当我找到它时,我想知道你最好的方法是什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

    Queryset.reverse()https://docs.djangoproject.com/en/2.2/ref/models/querysets/#reverse

    querySet.reverse()[:20] 应该这样做。

    【讨论】:

      【解决方案2】:

      这是因为,在大多数情况下,Django 查询集似乎就是这种情况,reversed 不会生成列表而是生成迭代器:

      >>> reversed([1,2,3])
      <list_reverseiterator object at 0x7f3ba766cc50>
      

      而且迭代器是不可下标的。更准确地说:它没有__getitem__ 方法。

      因此,这将不起作用:

      >>> reversed([1,2,3])[0]
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: 'list_reverseiterator' object is not subscriptable
      

      但这会(在访问项目之前从迭代器创建一个列表):

      >>> list(reversed([1,2,3]))[0]
      3
      

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2015-09-26
        • 2015-05-09
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多