将值浮动为字典键

时间:2014-05-18 11:07:44

标签: python dictionary floating-point key

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

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

您如何解决这个问题?

6 个答案:

答案 0 :(得分:23)

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

只需round(n, 1)将它们标准化为您的密钥空间。例如

>>> hash(round(6.84, 1))
3543446220
>>> hash(round(6.75, 1))
3543446220

答案 1 :(得分:4)

也许你想在使用is之前截断你的浮点数?

也许是这样的:

a = 0.122334
round(a, 4)       #<-- use this as your key?

您的密钥现在是:

0.1223           # still a float, but you have control over its quality

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

dictionary[round(a, 4)]   

检索您的值

答案 2 :(得分:0)

另一种选择是使用元组:

dictionary = {(6.8,): 0.3985}
dictionary[(6.8,)]

然后使用诸如此类的

操作轻松地在以后检索值以进行绘图
points = [(pH, value) for (pH,), value in dictionary.items()]
    ...

答案 3 :(得分:0)

另一个快速的选择是使用浮点数的字符串

ExecuteNonQuery

将打印出

a = 200.01234567890123456789
b = {str(a): 1}
for key in b:
    print(float(key), b[key])

通知(200.012345679, 1) 在小数点后第十位被截断

答案 4 :(得分:0)

另一种方法是将键输入为带点而不是p的字符串,然后将其重铸为浮点以便绘图。

就个人而言,如果您不坚持dict格式,我会将数据存储为以pH为列的pandas数据框,因为这些数据更易于传递到绘图库中

答案 5 :(得分:0)

如果您想在程序中的多个位置使用浮点键字典,我可能值得在 new dictionary class (full implementation) 中“隐藏”它应该如何使用(即使用四舍五入的键)的复杂性。

示例:

>>> d = FloatKeyDictionary(2, {math.pi: "foo"})
>>> d
{3.14: 'foo'}

>>> d[3.1415]
'foo'

>>> 3.1 in d
False

>>> d[math.e] = "My hovercraft is full of eels!"
>>> d
{3.14: 'foo', 2.72: 'My hovercraft is full of eels!'}

您可以找到具有以下总体思路的删节版:

import abc
import collections.abc


class KeyTransformDictionaryBase(dict, abc.ABC):

    @abc.abstractmethod
    def __key_transform__(self, key):
        raise NotImplementedError

    def __contains__(self, key):
        return super().__contains__(self.__key_transform__(key))

    def __getitem__(self, key):
        return super().__getitem__(self.__key_transform__(key))

    def __setitem__(self, key, value):
        return super().__setitem__(self.__key_transform__(key), value)

    def __delitem__(self, key):
        return super().__delitem__(self.__key_transform__(key))


class FloatKeyDictionary(KeyTransformDictionaryBase):

    def __init__(self, rounding_ndigits, data=None):
        super().__init__()
        self.rounding_ndigits = rounding_ndigits
        if data is not None:
            self.update(data)

    def __key_transform__(self, key):
        return round(key, self.rounding_ndigits)