【问题标题】:Python - Create list with numbers between 2 values?Python - 创建具有 2 个值之间的数字的列表?
【发布时间】:2013-08-18 10:11:16
【问题描述】:

如何创建一个列表,其中的值介于我输入的两个值之间? 例如,为 11 到 16 的值生成以下列表:

list = [11, 12, 13, 14, 15, 16]

【问题讨论】:

    标签: python list


    【解决方案1】:

    使用range。在 Python 2.x 中,它返回一个列表,所以您只需要:

    >>> range(11, 17)
    [11, 12, 13, 14, 15, 16]
    

    在 Python 3.x 中,range 是一个迭代器。因此,您需要将其转换为列表:

    >>> list(range(11, 17))
    [11, 12, 13, 14, 15, 16]
    

    注意:第二个数字是排他的。所以,这里需要16+1 = 17

    编辑:

    要回答有关以0.5 递增的问题,最简单的选择可能是使用numpy's arange().tolist()

    >>> import numpy as np
    >>> np.arange(11, 17, 0.5).tolist()
    
    [11.0, 11.5, 12.0, 12.5, 13.0, 13.5,
     14.0, 14.5, 15.0, 15.5, 16.0, 16.5]
    

    【讨论】:

    • 太棒了!正是我想要的!还有一种方法可以增加更小的值,比如 0.5 而不是 1?所以 [11.0, 11.5, 12.0 ...... 16.0]
    • @lorde 您可以使用第三个 step 参数增加超过 1 的值,但这仍然是一个 int——而不是 float。您不能在标准库中完全做到这一点。
    • @Jared 我可以通过在一段时间后删除一些值来制作一个列表。像 [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]
    • 很适合讲述 Python 2.x 和 3.x。
    • 如果您在不需要 numpy 的情况下工作,请考虑(其中 x=11、y=17 和 step=0.5,如上):a_range = [x]+[x+(step* i) for i in range(int((yx)/step))]
    【解决方案2】:

    你好像在找range()

    >>> x1=11
    >>> x2=16
    >>> range(x1, x2+1)
    [11, 12, 13, 14, 15, 16]
    >>> list1 = range(x1, x2+1)
    >>> list1
    [11, 12, 13, 14, 15, 16]
    

    对于以0.5 而不是1 递增,例如:

    >>> list2 = [x*0.5 for x in range(2*x1, 2*x2+1)]
    >>> list2
    [11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]
    

    【讨论】:

    • 只是一个小问题。在第一个代码块中,您使用 list 作为变量。
    • 在 python 中list 是一个内置类,因此不鼓励将其用作变量
    • x*increment,但是 2*startvalue 是什么意思,有什么用?你能解释一下吗?
    【解决方案3】:

    试试:

    range(x1, x2+1)  
    

    这是 Python 2.x 中的列表,其行为与 Python 3.x 中的列表非常相似。如果您正在运行 Python 3 并且需要一个可以修改的列表,请使用:

    list(range(x1, x2+1))
    

    【讨论】:

      【解决方案4】:

      假设您希望有一个介于 x 到 y 之间的范围

      range(x,y+1)
      
      >>> range(11,17)
      [11, 12, 13, 14, 15, 16]
      >>>
      

      3.x 支持的使用列表

      【讨论】:

        【解决方案5】:

        如果您正在寻找适用于浮点类型的类似范围的函数,那么这里有一个非常好的article

        def frange(start, stop, step=1.0):
            ''' "range()" like function which accept float type''' 
            i = start
            while i < stop:
                yield i
                i += step
        # Generate one element at a time.
        # Preferred when you don't need all generated elements at the same time. 
        # This will save memory.
        for i in frange(1.0, 2.0, 0.5):
            print i   # Use generated element.
        # Generate all elements at once.
        # Preferred when generated list ought to be small.
        print list(frange(1.0, 10.0, 0.5))    
        

        输出:

        1.0
        1.5
        [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5]
        

        【讨论】:

        • 为什么不用单线呢? start = 2; step =1; end = 10; z= np.array(range(start*step,step*end))/step; print(z)
        【解决方案6】:

        在 python 中使用列表推导。由于您也希望列表中有 16 个.. 使用 x2+1。范围函数不包括函数中的上限。

        list=[x for x in range(x1, x2+1)]
        

        【讨论】:

        • 如果您使用range(),则无需使用列表推导
        • @BillalBegueradj 在 Python3 中,range() 返回类似生成器的对象而不是列表。它与 Python 2 中的 xrange() 基本相同。你说得对,不需要列表理解。 list() 内置函数更简单:list(range(x1, x2+1)).
        • @MikeHousky 不,range 绝对不是类似生成器的对象。它是一个序列类型的对象。除非您想做诸如追加到序列之类的事情,否则您可能可以直接使用范围对象。
        • 在这里使用列表理解是没有意义的。 [x for x in whatever] 应始终为 list(whatever)
        【解决方案7】:

        在python中你可以很容易地做到这一点

        start=0
        end=10
        arr=list(range(start,end+1))
        output: arr=[0,1,2,3,4,5,6,7,8,9,10]
        

        或者你可以创建一个递归函数,返回一个给定数字的数组:

        ar=[]
        def diff(start,end):
            if start==end:
                d.append(end)
                return ar
            else:
                ar.append(end)
                return diff(start-1,end) 
        

        输出: ar=[10,9,8,7,6,5,4,3,2,1,0]

        【讨论】:

          【解决方案8】:

          我来到这里是因为我想使用列表推导以 0.1 的增量创建一个介于 -10 和 10 之间的范围。而不是像上面大多数答案那样做一个过于复杂的功能,我只是这样做了

          simple_range = [ x*0.1 for x in range(-100, 100) ]
          

          通过将范围计数更改为 100,我现在可以使用标准范围函数获得 -10 到 10 的范围。所以如果你在 0.2 之前需要它,那么只需执行 range(-200, 200) 等等

          【讨论】:

            【解决方案9】:

            最优雅的方法是使用range 函数,但是如果你想重新创建这个逻辑,你可以这样做:

            def custom_range(*args):
                s = slice(*args)
                start, stop, step = s.start, s.stop, s.step
                if 0 == step:
                    raise ValueError("range() arg 3 must not be zero")
                i = start
                while i < stop if step > 0 else i > stop:
                    yield i
                    i += step
            
            >>> [x for x in custom_range(10, 3, -1)]
            

            这会产生输出:

            [10, 9, 8, 7, 6, 5, 4]
            

            正如@Jared 之前所说,最好的方法是使用rangenumpy.arrange,但是我觉得代码很有趣,可以分享。

            【讨论】:

            • list(custom_range(10,3,1)) 返回空列表。
            • 确实,就像[x for x in range(10, 3, 1)] - 第一个参数是开始,第二个是结束,最后一个是步骤。 ==> 停止 > 开始
            【解决方案10】:

            上面的每个答案都假设范围仅是正数。这是返回连续数字列表的解决方案,其中参数可以是任何(正或负),并且可以设置可选的步长值(默认 = 1)。

            def any_number_range(a,b,s=1):
            """ Generate consecutive values list between two numbers with optional step (default=1)."""
            if (a == b):
                return a
            else:
                mx = max(a,b)
                mn = min(a,b)
                result = []
                # inclusive upper limit. If not needed, delete '+1' in the line below
                while(mn < mx + 1):
                    # if step is positive we go from min to max
                    if s > 0:
                        result.append(mn)
                        mn += s
                    # if step is negative we go from max to min
                    if s < 0:
                        result.append(mx)
                        mx += s
                return result
            

            例如,标准命令list(range(1,-3))返回空列表[],而这个函数将返回[-3,-2,-1,0,1]

            更新:现在步骤可能是负数。感谢@Michael 的评论。

            【讨论】:

            • 这假设你的步骤是积极的。
            • @Michael,说得好。我已经更新了代码,所以现在你可以有消极的步骤:)
            • @tgikal,没错。但是,如果您不知道函数的参数将被分配什么值并且需要排序返回怎么办?
            • 我没有看到您的自定义函数所做的任何其他功能无法使用内置范围函数完成,我想一个改进的例子会很棒,因为您当前的示例基本上是 i_min = -3, i_max = 1 any_number_range(i_max, i_min)) 返回 [-3,-2,-1,0,1] 但是,内置 list(range(i_min, i_max + 1)) 将返回相同的值。
            • 当序列递减时尝试使用负步长list(range(1,-3, -1))
            【解决方案11】:

            虽然@Jared 的递增答案适用于0.5 步长,但由于舍入问题,它对于其他步长失败:

            np.arange(11, 17, 0.1).tolist()
            # [11.0,11.1,11.2,11.299999999999999, ...   16.79999999999998, 16.899999999999977]
            

            相反,我自己需要这样的东西,而不仅仅是为0.5工作:

            # Example 11->16 step 0.5
            s = 11
            e = 16
            step = 0.5
            my_list = [round(num, 2) for num in np.linspace(s,e,(e-s)*int(1/step)+1).tolist()]
            # [11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]
            
            # Example 0->1 step 0.1
            s = 0
            e = 1
            step = 0.1
            my_list = [round(num, 2) for num in np.linspace(s,e,(e-s)*int(1/step)+1).tolist()]
            # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
            

            【讨论】:

              【解决方案12】:

              @YTZ 的回答对我来说效果很好。我必须生成一个从 0 到 10000 的列表,步长为 0.01,并且由于舍入问题,在每次迭代中简单地添加 0.01 不起作用。

              因此,我使用@YTZ 的建议,编写了以下函数:

              import numpy as np
              
              
              def generate_floating_numbers_in_range(start: int, end: int, step: float):
                  """
                  Generate a list of floating numbers within a specified range.
              
                  :param start: range start
                  :param end: range end
                  :param step: range step
                  :return:
                  """
                  numbers = np.linspace(start, end,(end-start)*int(1/step)+1).tolist()
                  return [round(num, 2) for num in numbers]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-22
                • 2021-08-15
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多