【问题标题】:How to get list of the range consisting of floats? [duplicate]如何获取由浮点数组成的范围列表? [复制]
【发布时间】:2013-12-19 06:40:40
【问题描述】:

如何获取由浮点数组成的范围列表?为什么下面的代码不起作用?

lons = list (range(80.0,90.0,0.05))

print (lons)

【问题讨论】:

    标签: python


    【解决方案1】:

    如果您不想编写自己的函数,可以结合使用 takewhilecount(从 2.7 开始),例如:

    from itertools import takewhile, count
    my_range = list(takewhile(lambda L: L < 90, count(80, 0.05)))
    

    【讨论】:

    • 显然你要检查 min_val takewhile 将无限运行。
    • 您的函数存在与this one 相同的舍入错误。甚至文档也建议不要在 count 中使用浮点值。
    • @JonathonReinhart 确实......当+'d......时,放任何能给出合理结果的东西......例如decimal.Decimal - 问题是如何获得一系列浮动 - 这个规定...结果是否最终可取是另一回事:)
    【解决方案2】:

    您可以使用生成器函数:

    from math import ceil
    def solve(start, end, step):
        #http://stackoverflow.com/a/10986098/846892
        for i in xrange(int(ceil((end-start)/step))):
            yield start + step*i
    print list(solve(80.0, 90.0, 0.5))
    #[80.0, 80.5, 81.0, 81.5, 82.0, 82.5, 83.0, 83.5, 84.0, 84.5, 85.0, 85.5, 86.0, 86.5, 87.0, 87.5, 88.0, 88.5, 89.0, 89.5]
    

    或者使用NumPy:

    >>> import numpy as np
    >>> np.arange(80., 90., .5)                                                                 
    array([ 80. ,  80.5,  81. ,  81.5,  82. ,  82.5,  83. ,  83.5,  84. ,                            
            84.5,  85. ,  85.5,  86. ,  86.5,  87. ,  87.5,  88. ,  88.5,                            
            89. ,  89.5])   
    

    【讨论】:

    • 您的函数存在与this one 相同的舍入错误。
    • @JonathonReinhart 更新了解决方案。
    【解决方案3】:

    来自range 的 Python 文档:

    参数必须是纯整数。

    【讨论】:

    • 这是对的,但它无助于提问者得到一个浮动范围。
    【解决方案4】:

    range 只需要整数。 您可以形成一个范围并将它们乘以浮点数以获得您需要的数字,就像这样

    lons = [80+x*0.05 for x in range(0,200)]
    

    请注意,对于这么多数字,您最终可能会出现小的舍入“错误”。

    【讨论】:

    • 你没有累积浮点值,所以你不应该有任何舍入错误,对吧?
    • @JonathonReinhart 我在 2.6 上得到了四舍五入,但在 2.7 上没有
    【解决方案5】:

    range 仅适用于整数。请参阅http://docs.python.org/2/library/functions.html#range的文档

    您正在寻找的功能是:

    def floatrange(min_val, max_val, step):
        val=min_val
        while val < max_val:
            yield val
            val += step
    

    【讨论】:

      【解决方案6】:

      您可以创建自己的范围函数来管理浮动。

      def n_range(x, y, jump):
      ... 而 x ... 产量 x
      ... x += 跳跃
      ...
      lons = list (n_range(80.0,90.0,0.05))

      打印(lons)

      【讨论】:

        【解决方案7】:

        我尊敬的人曾经说过:

        浮点数没有意义。

        所以你的问题的实际答案是:你做错了:)

        但由于这不能完全算作 SO 上的答案,所以这里有一个可以为您工作的 frange 函数。它将所有内容提升为整数并产生您想要的浮点数。

        您可能从代码中可以看出,decpl 代表“小数位”并定义浮点参数的分辨率。我认为没有一种简单的方法可以可靠地从传递给 step 参数的值中得出该值。 (欢迎评论)

        def frange(start, stop, step, decpl):
            exp = 10.0 ** decpl
            for i in xrange(int(start * exp), int(stop*exp), int(step*exp)):
                yield i / exp
        
        print list(frange(80, 90, 0.1, 1))
        

        【讨论】:

          猜你喜欢
          • 2014-03-31
          • 2016-10-06
          • 2021-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多