我正在开发一个用于分析微量滴定板的课程。样本在单独的文件中描述,条目用于有序字典。其中一个关键是pH,通常以浮子形式给出。例如6.8
我可以使用Decimal('6.8')
将其作为十进制导入,以避免浮点数为dict键。另一种解决方案是用例如6p8替换点或在我的样本描述中写入6p8,从而在开始时消除问题。但这会引起麻烦,因为我无法在我的数据中绘制6p8的pH值。
您如何解决这个问题?
答案 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)