Search code examples
python-3.xsortinglist-comprehensionpriority-queue

How can I sort a list in python 3 with priority given to specific values?


I have a list called V. The elements of V will be one of be one of: 0,1,2 or +inf

I would like to sort this list such that 2 is always at the beginning and the list is sorted in ascending order from then on.

For example, if the list is initially V = [0,1,2,inf] It should then become V = [2,0,1,inf]

I have a good idea of how to do this with conditionals and appending into a new list, but if possible I'd like to sort this with a key or a comprehension.

I am writing this in Python3 but I would prefer to not import anything


Solution

  • Use a lambda to create a tuple and test if the first element is one of the preferred values:

    >>> V = [0,1,2,float('inf')] 
    >>> sorted(V, key=lambda e: (e!=2, e))
    [2, 0, 1, inf]
    

    So the tuple will be one of (True, the_value) or (False, the_value). False < True and that trumps whatever the second actual value in the tuple is.

    If you have more than one preferred value, you can use in with a tuple of preferred values:

    >>> sorted(V, key=lambda e: (e not in (1,2), e))
    [1, 2, 0, inf]
    >>> sorted(V, key=lambda e: (e not in (2,0), e))
    [0, 2, 1, inf]
    

    You could also create a comprehension:

    >>> [(e not in (0,2),e) for e in V]
    [(False, 0), (True, 1), (False, 2), (True, inf)]
    

    And then sort that:

    >>> [t[1] for t in sorted((e not in (0,2),e) for e in V)]
    [0, 2, 1, inf]
    

    Which is a form of Decorate, Sort, Undecorate