【问题标题】:Generate a sequence of numbers in Python在 Python 中生成一个数字序列
【发布时间】:2012-06-19 08:44:45
【问题描述】:

如何在 Python 中生成数字序列“1,2,5,6,9,10......”等直到 100? 我什至需要包含逗号 (','),但这不是主要问题。

序列:从 1..100 开始的每个数字,可被 4 整除,余数为 1 或 2。

【问题讨论】:

    标签: python sequence


    【解决方案1】:

    1,2,5,6,9,10...中的每个数字都可以被 4 整除,余数为 1 或 2。

    >>> ','.join(str(i) for i in xrange(100) if i % 4 in (1,2))
    '1,2,5,6,9,10,13,14,...'
    

    【讨论】:

    • Oleh Prypin 提供了 Python 3 版本
    【解决方案2】:
    >>> ','.join('{},{}'.format(i, i + 1) for i in range(1, 100, 4))
    '1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'
    

    这是一个快速且相当肮脏的解决方案。

    现在,针对不同种类的进度问题的解决方案:

    def deltas():
        while True:
            yield 1
            yield 3
    def numbers(start, deltas, max):
        i = start
        while i <= max:
            yield i
            i += next(deltas)
    print(','.join(str(i) for i in numbers(1, deltas(), 100)))
    

    以下是使用itertools 实现的类似想法:

    from itertools import cycle, takewhile, accumulate, chain
    
    def numbers(start, deltas, max):
        deltas = cycle(deltas)
        numbers = accumulate(chain([start], deltas))
        return takewhile(lambda x: x <= max, numbers)
    
    print(','.join(str(x) for x in numbers(1, [1, 3], 100)))
    

    【讨论】:

    • 一个班轮,谢谢!这是非常好的!最初我认为这个 'odd = []' 'even = []' 'for c in range(0,100):' 'if c%2==0:' 'odd.append(c)' 'for c in range(0,100):' 'if c%2==1:' 'even.append(c)' 'for c in range(0, 50):' 'if c % 2 == 0:' 'print(even [c],end=",")' 'else:' 'print(odd[c],end=",")' 是的,我是新人。但我知道一定有更好的方法!谢谢大家!
    • 非常感谢您对最终功能的进一步描述。
    【解决方案3】:

    包括对您期望的确切顺序的一些猜测:

    >>> l = list(range(1, 100, 4)) + list(range(2, 100, 4))
    >>> l.sort()
    >>> ','.join(map(str, l))
    '1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'
    

    作为单行:

    >>> ','.join(map(str, sorted(list(range(1, 100, 4))) + list(range(2, 100, 4))))
    

    (顺便说一句。这是 Python 3 兼容的)

    【讨论】:

      【解决方案4】:

      这是通过利用列表的 % 属性而不是增量来实现的。

      for num in range(1,100):
          if num % 4 == 1 or num % 4 ==2:
              n.append(num)
              continue
          pass
      

      【讨论】:

        【解决方案5】:

        使用 numpy 和列表​​推导你可以做到

        import numpy as np
        [num for num in np.arange(1,101) if (num%4 == 1 or num%4 == 2)]
        

        【讨论】:

          【解决方案6】:

          假设我猜对了模式(1 和 3 的交替增量),这应该会产生预期的结果:

          def sequence():
              res = []
              diff = 1
              x = 1
              while x <= 100:
                  res.append(x)
                  x += diff
                  diff = 3 if diff == 1 else 1
              return ', '.join(res)
          

          【讨论】:

            【解决方案7】:

            假设您的序列在 1 和 3 之间交替递增

            numbers = [1]
            while numbers[-1] < 100:
                numbers.append(numbers[-1] + 1)
                numbers.append(numbers[-1] + 3)
            
            print ', '.join(map(str, numbers))
            

            如果您的序列不同,这可能更容易修改,但我认为 poke 或 BlaXpirit 比我的更好。

            【讨论】:

              【解决方案8】:

              编写一个以数字为参数并打印斐波那契数列直到该数字的函数

              def Series(n):  
                  a = 0  
                  b = 1  
                  print(a)  
                  print(b)  
                  S = 0  
                  for i in range(0,n):  
                      if S <= n-1:  
                          S = a + b  
                          print(S)  
                          a = b  
                          b = S
              

              【讨论】:

                【解决方案9】:

                在 python 3.1 中,您可以通过某种方式生成列表

                     lst=list(range(100))
                     for i in range(100)
                        print (lst[i],',',end='')
                

                在 python 2.7 中你可以这样做

                     lst=range(100)
                     for i in range(100)
                        print lst[i]+',' 
                

                【讨论】:

                • 为什么要迭代一个单独的范围对象?您应该只遍历列表项。
                最近更新 更多