我有一个从数据结构生成的浮点数列表,这是一个字典列表 - 即我已遍历整个列表并为给定字典中的某些值选择。现在,我想实际对这些数据点做一些事情,我需要对原始位置进行一些参考。我试图简单地使用数据点作为键,但在尝试和失败之后我做了一些挖掘并意识到由于计算机的工作方式,浮点数没有精确表示。
所以,我需要的是为列表中的每个字典分配一个唯一值的方法,例如:
list = [...]
vallist = []
index = {}
for i in range(0, len(list)):
value = i+0.123
vallist.append(value)
index[value] = i
除了我显然需要为每个值分配一个唯一的项目,以便能够指回它们在列表对象中的位置。我想象我可能会创建一个名为“valuelist”的新对象,然后将其转换为int,但这似乎可能有一个显而易见的解决方法,我只是太粗糙了。
重申一下,我想要的是一种让值回到列表中原始位置的方法 - 在我的数据结构中,我的列表包含大量字典,而我处理它的方式稍微复杂一些,所以我有点不习惯我可能不切实际的结构。
谢谢!
答案 0 :(得分:2)
首先,让我们解决使用浮点问题。
由于计算机的工作方式,浮动没有准确表示。
浮点数 在计算机中精确表示。但是,有一些限制:
"{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
最后,如果您的数字不合理,或者即使在使用小数或分数时您正在编制索引事件,您最好的选择可能是索引舍入版本的数字。如有必要,请使用buckets。 collections.defaultdict
可能对此有用。
你也可以保留一棵树,或者在带有自定义比较功能的列表上使用binary search,但你不会O(1)
查找
答案 1 :(得分:1)
如果我理解正确,你已经生成了一个浮动列表,每个浮点数都来自原始列表中的一个序列。为什么不生成一个2元组的列表,而不是生成一个浮点列表,作为浮点数,它是相应的字典列表索引......