On Tue, 2006-10-10 at 15:41 +0100, Tom Smith wrote:
>
> On 10 Oct 2006, at 15:08, Tom Smith wrote:
>
> >
> > Sorry for what is probably a simple python question, but if I have a
> > list of Products and I have searched for 100 of them ordered by x...
> >
> > then how do I then sort the QuerySet returned by title?
> >
> > I can't do an .. object_list = products.items().sort('title')
> >
> > because I have already done a [:100] on the results...
>
> ... answering my own question but this works... probably will be slow
> for a large collection of objects but it's useful for making a
> tagcloud (unfinished)..
Time these things before worrying about whether they are too slow. You
are only dealing with 100 items and sorting in Python is a fast
operation. The geniuses behind the code have put a lot of work into
making it go like the wind (on a very windy day). As a general rule, if
you can reduce a Python algorithm to something based on sorting, you are
going to be very happy.
> def tagcloud(request):
>
> def sort(objects, sortAttrib):
> sortValues = [(getattr(objects[i], sortAttrib), i) for i in
> range
> (len(objects))]
> sortValues.sort(), # Sorts by first value in tuple
> return [objects[sortTuple[1]] for sortTuple in sortValues]
>
> words = Word.objects.all().order_by('value').order_by('-
> product_count')[:100] # I have calculated these before-hand by
> splitting product.name into words and creating 2 tables (word and
> product_word)
> big_num = words[0].product_count # get the biggest
>
> for word in words:
> word.percentage = ((word.product_count * 100) / big_num) + 10
> #
> the 10 is a hack so the fonts don't disappear....
> words = sort(words, 'value') #see above
You can be a little more efficient than this. The built in sort() method
on a list takes an optional comparator function that compares two items
at a time. So you could throw away your sort function and replace it
with
words = list(words)
words.sort(lambda lhs, rhs: cmp(lhs.value, rhs.value))
which would save a couple of passes over the list. In Python 2.4, you
can also get a little bit more speed using the "key" attribute to sort()
or using the sorted() method (see the Python docs for details on those).
Cheers,
Malcolm
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users
-~----------~----~----~----~------~----~------~--~---