【问题标题】:Convert a list of integers to a list of consecutive positive integers将整数列表转换为连续正整数列表
【发布时间】:2022-11-10 00:37:11
【问题描述】:

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

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]

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

【问题讨论】:

    标签: python


    【解决方案1】:

    我认为你让它变得比它需要的更复杂。只需保留一个计数器并在数字更改时碰撞。

    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]
    

    【讨论】:

    • 整洁,简约,没有单一的进口!
    【解决方案2】:

    itertools.groupby:

    from itertools import groupby
    
    def consecutive_inc(iterable, start=0):
        """
        >>> list(consecutive_inc([0, 1, 1, 3, 4, 4, 5]))
        [0, 1, 1, 2, 3, 3, 4]
        """
        return (i for i, (_, g) in enumerate(groupby(iterable), start) for _ in g)
    

    这使用 O(1) 空间并适用于任意迭代。

    【讨论】:

      【解决方案3】:

      您可以像数学集一样使用dict 来跟踪您之前看到的唯一数字的数量:

      def consecutive_positive_inc(l):
        m = {}
        r = []
        for i in l:
          m[i] = None
          r.append(len(m) - 1)
        return r
      

      【讨论】:

      • 为什么不像数学集合那样使用set
      【解决方案4】:

      您可以使用collections.Counter 在一行中执行此操作:

      >>> from collections import Counter
      >>> def consecutive_positive_inc(arr):
      ...     return [i for i, count in enumerate(Counter(arr).values()) for _ in range(count)]
      ...
      >>> consecutive_positive_inc([0, 1, 1, 3, 4, 4, 5])
      [0, 1, 1, 2, 3, 3, 4]
      

      【讨论】:

        【解决方案5】:

        从集合导入计数器 def Continuous_positive_inc(arr): ... return [i for i, count in enumerate(Counter(arr).values()) for _ in range(count)] ... Continuous_positive_inc([0, 1, 1, 3, 4, 4, 5]) [0, 1, 1, 2, 3, 3, 4]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-04
          • 2020-01-23
          • 1970-01-01
          • 2012-03-21
          • 2016-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多