【问题标题】:Indexing float values in Python在 Python 中索引浮点值
【发布时间】:2014-01-16 13:04:40
【问题描述】:

我有一个从数据结构生成的浮点列表,该数据结构是一个字典列表 - 即我已经遍历整个列表并选择给定字典中的某些值。现在,我想对这些数据点进行实际操作,为此我需要参考原始位置。我尝试简单地将数据点用作键,但在尝试并失败后,我进行了一些挖掘并意识到由于计算机的工作方式,浮点数并不能精确表示。

所以,我需要一些方法来为列表中的每个字典分配一个唯一值,例如:

list = [...]
vallist = []
index = {}
for i in range(0, len(list)):
value = i+0.123
vallist.append(value)
index[value] = i

除了我显然需要为每个值分配一个唯一的项目,以便能够指向它们在列表对象中的位置。我在想象我可以创建一个名为“valuelist”或其他东西的新对象,然后对其进行 int,但这似乎有一个明显的解决方法,我只是太厚了,无法弄清楚。

重申一下,我想要的是一种让值指向它们在列表中的原始位置的方法——在我的数据结构中,我的列表包含大量字典,而我处理它的方式有点复杂,所以我有点坚持我可能不切实际的结构。

谢谢!

【问题讨论】:

    标签: python dictionary floating-point indexing


    【解决方案1】:

    首先,让我们解决使用浮点带来的问题。

    由于计算机的工作方式,浮点数无法精确表示。

    浮点数在计算机中精确表示。但是,有一些限制:

    • 分辨率是有限的。在有限的内存中表示无理数是不可能的,典型的浮点数只能表示几十位数。
    • 一些十进制(base10)数字have no exact representation in binary。例如,0.1 不能以 2 为底精确表示。在 python 中运行"{0:.20f}".format(0.1) 将返回0.10000000000000000555

    现在,根据您的数字来源以及您要执行的计算类型,有不同的可能解决方案来索引它们。

    对于可以用 base10 精确描述的数字,您可以使用Decimal。这正好代表 base10 中的数字:

    >>> from decimal import Decimal
    >>> "{0:.20f}".format(Decimal('0.1'))
    '0.10000000000000000000'
    

    如果您只处理有理数(即使是那些没有精确十进制表示的),您可以使用fractions

    请注意,如果您使用小数或分数,则需要在处理过程中尽快使用它们。在后期从浮点数转换为小数/分数会破坏它们的目的 - 您无法获得不存在的数据:

    >>> "{0:.20f}".format(Decimal('0.1'))
    '0.10000000000000000000'
    >>> "{0:.20f}".format(Decimal(0.1))
    '0.10000000000000000555'
    

    此外,使用小数或分数会显着降低性能。对于严重的数字运算,您需要始终使用浮点数,甚至 integers in their place

    最后,如果您的数字不合理,或者即使在使用小数或分数时也遇到了索引错误,那么您最好的选择可能是索引数字的 四舍五入 版本。如有必要,请使用bucketscollections.defaultdict 可能对此有用。

    您也可以保留一棵树,或在具有自定义比较功能的列表上使用 binary search,但您不会有 O(1) 查找

    【讨论】:

    • 这看起来像我所追求的!我应该知道 Python 会为此提供一个模块。谢谢!
    【解决方案2】:

    如果我理解正确,您已经生成了一个浮点数列表,每个浮点数都来自原始列表中的一个字典。与其生成浮点数列表,不如生成一个 2 元组列表,即浮点数及其对应的字典列表索引...

    【讨论】:

    • 这就是我最初尝试的方法,但是浮点值的分配方式非常不精确,因此如果我尝试将它们用作字典键,则会出现键错误。 e.基本上,它会遍历第一个(例如,一百个)值,然后找到偏离值 0.000000001 之类的值并返回错误消息。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2022-11-17
    • 2021-04-08
    • 2020-12-26
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多