Bisect, is it possible to work with descending sorted lists?

前端 未结 10 717
旧巷少年郎
旧巷少年郎 2020-12-09 15:37

How can I use bisect module on lists that are sorted descending? e.g.

import bisect

x = [1.0,2.0,3.0,4.0] # normal, ascending
bisect.insort(x,2.5)  # -->         


        
10条回答
  •  一向
    一向 (楼主)
    2020-12-09 16:18

    Hopefully the "key" argument will be added to bisect module functions one day (see: http://bugs.python.org/issue4356). Unfortunately it's not possible without some kind of workaround at the moment (Python version < 3.4).

    One possible workaround is to use a wrapper like:

    class ReversedSequenceView(collections.MutableSequence):
        def __init__(self, seq):
            self._seq = seq
    
        def __getitem__(self, i):
            return self._seq[-1 - i]
    
        def __setitem__(self, i, v):
            self._seq[-1 - i] = v
    
        def __delitem__(self, i):
            del self._seq[-1 - i]
    
        def __len__(self):
            return len(self._seq)
    
        def insert(self, i, v):
            return self._seq.insert(len(self._seq) - i, v)
    

    Usage:

    >>> x = [4., 3., 2., 1.]
    >>> bisect.insort(ReversedSequenceView(x), 2.5)
    >>> x
    [4.0, 3.0, 2.5, 2.0, 1.0]
    

提交回复
热议问题