【问题标题】:Python: simple way to increment by alternating values?Python:通过交替值递增的简单方法?
【发布时间】:2017-01-07 13:34:43
【问题描述】:

我正在构建一个整数列表,应该以 2 个交替值递增。

例如,从 0 开始并在 4 和 2 之间交替直到 20 会:

[0,4,6,10,12,16,18]

range 和 xrange 只接受一个整数作为增量值。最简单的方法是什么?

【问题讨论】:

    标签: python increment


    【解决方案1】:

    我可能会使用一个简单的itertools.cycle 来循环执行这些步骤:

    from itertools import cycle
    def fancy_range(start, stop, steps=(1,)):
        steps = cycle(steps)
        val = start
        while val < stop:
            yield val
            val += next(steps)
    

    你可以这样称呼它:

    >>> list(fancy_range(0, 20, (4, 2)))
    [0, 4, 6, 10, 12, 16, 18]
    

    这里的优点是可以很好地扩展到任意数量的步骤(虽然我现在真的想不出有什么好的用途——但也许你可以)。

    【讨论】:

    • 谢谢,这正是我想要的。步数的缩放实际上非常适合我的需求。
    • 确实不错的解决方案。
    【解决方案2】:

    您可以使用列表推导和模运算符来做类似的聪明事情。例如:

    >>> [3*i + i%2 for i in range(10)]
    [0, 4, 6, 10, 12, 16, 18, 22, 24, 28]
    

    【讨论】:

      【解决方案3】:
      l = []
      a = 0
      for i in xrnage (N) :
          a += 2
          if i&1 == 0 :
              a+=2
          l.append (a)
      

      对我来说看起来很简单。

      【讨论】:

        【解决方案4】:

        这可能是一种灵活且适用于任何范围的解决方案。

        def custom_range(first, second, range_limit):
            start , end = range_limit
            step = first + second
            a = range(start, end, step)
            b = range(first, end, step)
            from itertools import izip_longest
            print [j for i in izip_longest(a,b) for j in i if j!=None]
        
        custom_range(4,2,(0,19))
        custom_range(6,5,(0,34))
        

        输出:

        [0, 4, 6, 10, 12, 16, 18]
        [0, 6, 11, 17, 22, 28, 33]
        

        【讨论】:

          【解决方案5】:

          1 生成从 0 到 n 的数字范围,步长为 4 2 生成另一个从 0 到 n 的数字范围,步长为 6 3 合并列表和排序。删除重复项

          >>> a = range(0,20,4)
          >>> a
          [0, 4, 8, 12, 16]
          >>> b = range(0,20,6)
          >>> c = sorted(a + b)
          >>> b
          [0, 6, 12, 18]
          >>> c
          [0, 0, 4, 6, 8, 12, 12, 16, 18]
          >>> c = list(set(c))
          >>> c
          [0, 4, 6, 8, 12, 16, 18]
          

          【讨论】:

            猜你喜欢
            • 2013-11-05
            • 1970-01-01
            • 2011-11-28
            • 2011-08-23
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 2016-08-03
            • 1970-01-01
            相关资源
            最近更新 更多