How to sort a list of objects based on an attribute of the objects?

前端 未结 8 2425
北海茫月
北海茫月 2020-11-21 23:30

I\'ve got a list of Python objects that I\'d like to sort by an attribute of the objects themselves. The list looks like:

>>> ut
[,         


        
相关标签:
8条回答
  • 2020-11-22 00:16

    Add rich comparison operators to the object class, then use sort() method of the list.
    See rich comparison in python.


    Update: Although this method would work, I think solution from Triptych is better suited to your case because way simpler.

    0 讨论(0)
  • 2020-11-22 00:20
    from operator import attrgetter
    ut.sort(key = attrgetter('count'), reverse = True)
    
    0 讨论(0)
  • 2020-11-22 00:27

    If the attribute you want to sort by is a property, then you can avoid importing operator.attrgetter and use the property's fget method instead.

    For example, for a class Circle with a property radius we could sort a list of circles by radii as follows:

    result = sorted(circles, key=Circle.radius.fget)
    

    This is not the most well-known feature but often saves me a line with the import.

    0 讨论(0)
  • 2020-11-22 00:28

    Readers should notice that the key= method:

    ut.sort(key=lambda x: x.count, reverse=True)
    

    is many times faster than adding rich comparison operators to the objects. I was surprised to read this (page 485 of "Python in a Nutshell"). You can confirm this by running tests on this little program:

    #!/usr/bin/env python
    import random
    
    class C:
        def __init__(self,count):
            self.count = count
    
        def __cmp__(self,other):
            return cmp(self.count,other.count)
    
    longList = [C(random.random()) for i in xrange(1000000)] #about 6.1 secs
    longList2 = longList[:]
    
    longList.sort() #about 52 - 6.1 = 46 secs
    longList2.sort(key = lambda c: c.count) #about 9 - 6.1 = 3 secs
    

    My, very minimal, tests show the first sort is more than 10 times slower, but the book says it is only about 5 times slower in general. The reason they say is due to the highly optimizes sort algorithm used in python (timsort).

    Still, its very odd that .sort(lambda) is faster than plain old .sort(). I hope they fix that.

    0 讨论(0)
  • 2020-11-22 00:29

    It looks much like a list of Django ORM model instances.

    Why not sort them on query like this:

    ut = Tag.objects.order_by('-count')
    
    0 讨论(0)
  • 2020-11-22 00:31
    # To sort the list in place...
    ut.sort(key=lambda x: x.count, reverse=True)
    
    # To return a new list, use the sorted() built-in function...
    newlist = sorted(ut, key=lambda x: x.count, reverse=True)
    

    More on sorting by keys.

    0 讨论(0)
提交回复
热议问题