python - 在 Python 中索引浮点值

标签 python dictionary floating-point indexing

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

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

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

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

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

谢谢!

最佳答案

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

floats aren't precisely represented due to the way computers work.

float 在计算机中精确表示。然而,也有一些限制:

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

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

对于可以以 10 为基数精确描述的数字,您可以使用十进制。这准确地表示以 10 为基数的数字:

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

如果您只处理有理数(即使没有精确的小数表示形式),则可以使用 fractions .

请注意,如果您使用小数或分数,则需要在处理中尽快使用它们。在后期从 float 转换为小数/分数违背了它们的目的 - 你无法获取不存在的数据:

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

此外,使用小数或分数会带来显着的性能损失。对于严重的数字运算,您需要始终使用 float,甚至 integers in their place

最后,如果您的数字不合理,或者即使在使用小数或分数时也遇到索引错误,您最好的选择可能是对数字的四舍五入版本建立索引。使用buckets如果需要的话。 collections.defaultdict 可能对此有用。

您还可以保留一棵树,或使用 binary search具有自定义比较函数的列表,但您不会进行 O(1) 查找

关于python - 在 Python 中索引浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162624/

相关文章:

python - 在 python 中是否有相当于 'map' 的就地等效项?

swift - Xcode 如何将按钮添加到 ImageView

c# - 将颜色分配给值以显示与颜色分析图的对比

c++ - 固定一个值时计算pow(x,y)

c - 尽管未对其进行任何更改,C 中的全局变量也会发生变化

java - 如何在 Spark sql 中舍入值

python - 分割数据帧的行并将它们作为单独的行存储在同一数据帧中

python - 组内和组之间的平方和 ANOVA python

python - 相对路径Python错误

python - 更改当前进程环境的 LD_LIBRARY_PATH