将值浮动为字典键

Mor*_*itz 22 python floating-point dictionary key

我正在开发一个用于微量滴定板分析的课程.样本在单独的文件中描述,条目用于有序字典.其中一个关键是pH,通常以浮子形式给出.例如6.8

我可以将其导入为十进制,Decimal('6.8')以避免浮动为dict键.另一种解决方案是用例如像6p8的p替换点或在我的样本描述中写入6p8,从而在开始时消除问题.但这会引起麻烦,因为我无法在我的数字中绘制6p8的pH值.

你会如何解决这个问题?

Joh*_*ooy 24

将浮点数用作dict键是没有问题的.

只是将round(n, 1)它们标准化为您的键空间.例如.

>>> hash(round(6.84, 1))
3543446220
>>> hash(round(6.75, 1))
3543446220
Run Code Online (Sandbox Code Playgroud)

  • @PadraicCunningham,如果你确信浮子都是来自同一个来源并以相同的方式生产,你可以侥幸逃脱.但我不会非常信任那些不是来自我控制的来源的数据. (4认同)
  • @ BobStein-VisiBone,澄清 - 哈希必须等于相等的值,但相反的情况并非如此.这是另一个说哈希不必是唯一的原因.您可以考虑通过哈希查找过滤器,这样您就不需要针对每个键进行测试.在哈希过滤器之后,还测试密钥是否相等以清除误报. (3认同)
  • 我并不是故意建议你明确使用`hash`.`hash`值是dict如何确定键_might_是相等的(相等的值_must_具有相同的哈希值).这就是O(1)性能的获得方式.我只是在证明哈希值是相同的(当你明白圆的结果是相同的时,这是显而易见的) (2认同)

Reb*_*que 5

也许您想在使用 is 作为键之前截断浮点数?

也许是这样的:

a = 0.122334
round(a, 4)       #<-- use this as your key?
Run Code Online (Sandbox Code Playgroud)

你的钥匙现在是:

0.1223           # still a float, but you have control over its quality
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式使用它:

dictionary[round(a, 4)]   
Run Code Online (Sandbox Code Playgroud)

检索您的价值观