我有一个从数据结构生成的浮点数列表,它是一个字典列表 - 即我已经迭代了整个列表并选择了给定字典中的某些值。现在,我想实际对这些数据点做一些事情,为此我需要对原始位置的一些参考。我尝试简单地使用数据点作为关键,但在尝试和失败之后,我进行了一些挖掘,并意识到由于计算机的工作方式,浮点数并不能精确表示。
所以,我需要的是某种方法为列表中的每个字典分配唯一值,例如:
list = [...]
vallist = []
index = {}
for i in range(0, len(list)):
value = i+0.123
vallist.append(value)
index[value] = i
但我显然需要为每个值分配一个唯一的项目,以便能够指向它们在列表对象中的位置。我想象我可能会创建一个名为“valuelist”或其他东西的新对象,然后对其进行 int ,但这似乎可能有一个明显的解决方法,我只是太厚了而无法弄清楚。
重申一下,我想要的是一种使值指向它们在列表中的原始位置的方法 - 在我的数据结构中,我的列表包含大量字典,并且我处理它的方式有点复杂,所以我'我有点坚持我可能不切实际的结构。
Thanks!
首先,让我们解决使用浮点带来的问题。
由于计算机的工作方式,浮点数无法精确表示。
浮点数字are精确地在计算机中表示。然而,也有一些限制:
- 分辨率是有限的。在有限的内存中不可能表示无理数,典型的浮点数只能表示几十位数字。
- 一些十进制(以 10 为基数)数字没有精确的二进制表示。例如,0.1 不能精确地以 2 为基数表示。跑步
"{0:.20f}".format(0.1)
在Python中会返回0.10000000000000000555
.
现在,根据数字的来源以及要执行的计算类型,有不同的可能解决方案来对它们进行索引。
对于可以以 10 为基数精确描述的数字,您可以使用Decimal
。这准确地表示以 10 为基数的数字:
>>> 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,甚至整数在其位置
最后,如果您的数字不合理,或者即使使用小数或分数也遇到索引错误,那么您最好的选择可能是索引rounded数字的版本。使用buckets如果需要的话。collections.defaultdict
可能对此有用。
你也可以保留一棵树,或者使用二分查找在具有自定义比较功能的列表上,但您不会O(1)
lookup
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)