How can I get 2.x-like sorting behaviour in Python 3.x?

后端 未结 10 870
陌清茗
陌清茗 2020-11-27 06:50

I\'m trying to replicate (and if possible improve on) Python 2.x\'s sorting behaviour in 3.x, so that mutually orderable types like int, float etc.

10条回答
  •  孤独总比滥情好
    2020-11-27 07:20

    Stupid idea: make a first pass to divide all the different items in groups that can be compared between each other, sort the individual groups and finally concatenate them. I assume that an item is comparable to all members of a group, if it is comparable with the first member of a group. Something like this (Python3):

    import itertools
    
    def python2sort(x):
        it = iter(x)
        groups = [[next(it)]]
        for item in it:
            for group in groups:
                try:
                    item < group[0]  # exception if not comparable
                    group.append(item)
                    break
                except TypeError:
                    continue
            else:  # did not break, make new group
                groups.append([item])
        print(groups)  # for debugging
        return itertools.chain.from_iterable(sorted(group) for group in groups)
    

    This will have quadratic running time in the pathetic case that none of the items are comparable, but I guess the only way to know that for sure is to check all possible combinations. See the quadratic behavior as a deserved punishment for anyone trying to sort a long list of unsortable items, like complex numbers. In a more common case of a mix of some strings and some integers, the speed should be similar to the speed of a normal sort. Quick test:

    In [19]: x = [0, 'one', 2.3, 'four', -5, 1j, 2j,  -5.5, 13 , 15.3, 'aa', 'zz']
    
    In [20]: list(python2sort(x))
    [[0, 2.3, -5, -5.5, 13, 15.3], ['one', 'four', 'aa', 'zz'], [1j], [2j]]
    Out[20]: [-5.5, -5, 0, 2.3, 13, 15.3, 'aa', 'four', 'one', 'zz', 1j, 2j]
    

    It seems to be a 'stable sort' as well, since the groups are formed in the order the incomparable items are encountered.

提交回复
热议问题