Search code examples
pythonobjectsortedlist

Insert a custom object in a sorted list


I implemented an object with a numerical attribute. I want to keep a list of those objects sorted according to that attribute, without need to run a sort method at each insertion. I took a look to bisect module, but I do not know if I can use it also with an object. What is the best way to do that?


Solution

  • You can do this for your custom object if you implement the __lt__ method, because this is what bisect will use to compare your object.

    >>> class Foo(object):
    ...     def __init__(self, val):
    ...         self.prop = val # The value to compare
    ...     def __lt__(self, other):
    ...         return self.prop < other.prop
    ...     def __repr__(self):
    ...         return 'Foo({})'.format(self.prop)
    ...
    >>> sorted_foos = sorted([Foo(7), Foo(1), Foo(3), Foo(9)])
    >>> sorted_foos
    [Foo(1), Foo(3), Foo(7), Foo(9)]
    >>> bisect.insort_left(sorted_foos, Foo(2))
    >>> sorted_foos
    [Foo(1), Foo(2), Foo(3), Foo(7), Foo(9)]