限制排序方法的输出

时间:2009-07-21 22:46:33

标签: python django itertools

如果我的观看代码是:

arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True)

将结果限制为50个标签的参数是什么?

我假设:

.... limit=50)

不正确。

更完整的代码如下:

videoarttags = Media.objects.order_by('date_added'),filter(topic__exact='art') 
audioarttags = Audio.objects.order_by('date_added'),filter(topic__exact='art') 
conarttags = Concert.objects.order_by('date_added'),filter(topic__exact='art') 
arttags = list(chain(videoarttags, audioarttags, conarttags)) 
arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True) 

如何合并 -

itertools.islice(sorted(...),50)

5 个答案:

答案 0 :(得分:3)

heapq.nlargest怎么样:
返回包含iterable.key定义的数据集中n个最大元素的列表(如果提供),指定一个参数的函数,该函数用于从iterable中的每个元素中提取比较键:key=str.lower Equivalent to: sorted(iterable, key=key, reverse=True)[:n]

>>> from heapq import nlargest
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> nlargest(3, data)
[9, 8, 7]

答案 1 :(得分:2)

您可能会发现切片适合您:

arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True)[:50]

答案 2 :(得分:0)

我相信你想要的一般概念是take。来自the itertools documentation

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

答案 3 :(得分:0)

我认为我差点在错误的树上咆哮。我试图完成的实际上非常简单,使用模板过滤器(切片),我不知道我能做什么。 代码如下:

{% for arttag in arttags|slice:":50" %}

是的,我感觉非常愚蠢,但我很高兴我完成了它:-)

答案 4 :(得分:0)

您可能还想为每个objects.order_by.filter电话添加[:50]。这样做意味着您只需要在Python中对150个内存进行排序,而不是可能更多。