Python中的浮点值索引

Python中的浮点值索引,python,dictionary,floating-point,indexing,Python,Dictionary,Floating Point,Indexing,我有一个从数据结构生成的浮点列表,它是一个字典列表,也就是说,我已经遍历了整个列表,并为给定字典中的某些值进行了选择。现在,我想对这些数据点做点什么,我需要一些原始位置的参考。我试图简单地将数据点用作键,但在尝试失败后,我进行了一些挖掘,并意识到由于计算机的工作方式,浮点数无法精确表示 因此,我需要的是某种方法来为列表中的每个字典分配一个唯一的值,例如: list = [...] vallist = [] index = {} for i in range(0, len(list)): valu

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

因此,我需要的是某种方法来为列表中的每个字典分配一个唯一的值,例如:

list = [...]
vallist = []
index = {}
for i in range(0, len(list)):
value = i+0.123
vallist.append(value)
index[value] = i
除非我显然需要为每个值指定一个唯一的项,以便能够指向它们在列表对象中的位置。我想我可能会创建一个新的对象,称为“valuelist”或其他什么,然后在上面加上int,但这似乎有一个明显的解决方法,我实在想不出来

重申一下,我想要的是一种方法,使值返回到它们在列表中的原始位置-在我的数据结构中,我的列表包含大量的字典,我处理它的方式有点复杂,所以我被可能不切实际的结构卡住了


谢谢

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

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

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

浮点数在计算机中被精确地表示出来。但是,存在一些限制:

  • 分辨率是有限的。在有限内存中不可能表示无理数,典型的浮点只能表示几十位数字
  • 一些十进制(以10为基数)数字。例如,0.1不能在基2中精确表示。在python中运行
    “{0.20f}”。format(0.1)
    将返回
    0.100000000000000555
现在,根据您的数字来源和您想要执行的计算类型,有不同的索引解决方案

对于可以用base10精确描述的数字,可以使用
十进制
。这正好表示base10中的数字:

>>> from decimal import Decimal
>>> "{0:.20f}".format(Decimal('0.1'))
'0.10000000000000000000'
如果您专门处理有理数(即使没有精确的十进制表示),您可以使用

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

>>> "{0:.20f}".format(Decimal('0.1'))
'0.10000000000000000000'
>>> "{0:.20f}".format(Decimal(0.1))
'0.10000000000000000555'
此外,使用小数或分数将导致严重的性能损失。对于严重的数字运算,您需要始终使用float,甚至float

最后,如果您的数字是非理性的,或者即使在使用小数或分数时也会出现索引错误,那么最好的选择可能是为数字的四舍五入版本编制索引。必要时使用<代码>集合。defaultdict对此可能很有用


您也可以保留一棵树,或者使用自定义比较函数覆盖列表,但是您没有
O(1)
lookup

这是我最初尝试的,但是在如何分配浮点值方面存在非常小的不精确性,因此,例如,如果我尝试将它们用作字典键,我会得到keyrerrors。E基本上,它迭代第一个,比如,100个值,然后它发现某个值为0.000000001或某个值时关闭的值,并返回一条错误消息。这看起来就像我要找的!我应该知道Python会有一个用于此的模块。谢谢