我正在开发一个用于分析微孔板的类。样本在单独的文件中描述,并用于有序字典的条目中。其中一个键是pH,通常表示为浮点数,例如6.8。
我可以使用Decimal('6.8')
将其作为十进制数导入,以避免浮点数作为字典键。另一个解决方案是将点替换为例如p,如6p8或在我的样本说明中写入6p8,并因此在开始时消除问题。但这将在以后造成麻烦,因为我无法绘制pH为6p8的图表。
您将如何解决这个问题?
我正在开发一个用于分析微孔板的类。样本在单独的文件中描述,并用于有序字典的条目中。其中一个键是pH,通常表示为浮点数,例如6.8。
我可以使用Decimal('6.8')
将其作为十进制数导入,以避免浮点数作为字典键。另一个解决方案是将点替换为例如p,如6p8或在我的样本说明中写入6p8,并因此在开始时消除问题。但这将在以后造成麻烦,因为我无法绘制pH为6p8的图表。
您将如何解决这个问题?
使用浮点数作为字典键没有问题。
只需将它们 round(n, 1)
规范化为您的键空间即可,例如:
>>> hash(round(6.84, 1))
3543446220
>>> hash(round(6.75, 1))
3543446220
hash
。hash
值是字典判断键是否 可能 相等的依据(相等的值 必须 具有相同的哈希值)。这就是获得 O(1) 性能的方法。我只是想展示哈希值是相同的(当你理解 round 函数的结果时,这是很明显的)。 - John La Rooya = 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)]
获取您的值
>>> 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)
a = 200.01234567890123456789
b = {str(a): 1}
for key in b:
print(float(key), b[key])
会打印出来
(200.012345679, 1)
注意,a
在小数点后的第十位被截断。
另一个选择是使用元组:
dictionary = {(6.8,): 0.3985}
dictionary[(6.8,)]
然后稍后检索这些值以进行绘图就变得非常容易,可以使用类似以下的代码:
points = [(pH, value) for (pH,), value in dictionary.items()]
...