ограничить вывод из метода сортировки - PullRequest
0 голосов
/ 22 июля 2009

если код моего просмотра:

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 ]

3 голосов
/ 22 июля 2009

как насчет heapq.nlargest :
Возвращает список с n самыми большими элементами из набора данных, определенного iterable.key, если он предоставлен, задает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента в итерируемой:

>>> from heapq import nlargest
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> nlargest(3, data)
[9, 8, 7]
2 голосов
/ 22 июля 2009

Вы, вероятно, обнаружите, что срез работает для вас:

arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True)[:50]
0 голосов
/ 25 июля 2009

Вы также можете добавить [: 50] к каждому из вызовов objects.order_by.filter. Это будет означать, что вам нужно всего лишь отсортировать 150 элементов в памяти в Python вместо, возможно, многих других.

0 голосов
/ 25 июля 2009

Мне кажется, я почти не лаял не то дерево. То, что я пытался сделать, было на самом деле очень просто, используя фильтр шаблона (срез), который я не знал, что смогу сделать. Код был следующим:

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

Да, я чувствую себя довольно глупо, но я рад, что сделал это :-)

0 голосов
/ 22 июля 2009

Общая идея того, что вы хотите, это take, я полагаю.Из документации itertools :

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