将整数列表转换为连续正整数列表

Ant*_*rot 0 python

我想出了这段代码,将已排序的整数列表转换为连续正整数列表。

def consecutive_positive_inc(l):
    """
    [0, 1, 1, 3, 4, 4, 5] -> [0, 1, 1, 2, 3, 3, 4]
    """
    from collections import defaultdict

    d = defaultdict(int)
    for i in l:
        d[i] += 1

    for i, count in enumerate(d.values()):
        for _ in range(count):
            yield i


if __name__ == '__main__':
    l = [-3, -2, -1, 0, 1, 1, 3, 4, 4, 5]
    result = list(consecutive_positive_inc(l))
    assert result == [0, 1, 2, 3, 4, 4, 5, 6, 6, 7]
Run Code Online (Sandbox Code Playgroud)

这是最好的方法还是可以使用更简单的方法?

Tim*_*rts 5

我认为你让事情变得比需要的更复杂了。只需保留一个计数器并在数字变化时进行碰撞即可。

def consecutive_positive_inc(l):
    """
    [0, 1, 1, 3, 4, 4, 5] -> [0, 1, 1, 2, 3, 3, 4]
    """
    last = l[0]
    idx = 0
    for i in l:
        if i != last:
            idx += 1
            last = i
        yield idx


if __name__ == '__main__':
    l = [-3, -2, -1, 0, 1, 1, 3, 4, 4, 5]
    result = list(consecutive_positive_inc(l))
    assert result == [0, 1, 2, 3, 4, 4, 5, 6, 6, 7]
Run Code Online (Sandbox Code Playgroud)