2014-01-16 15 views
1

我有一個從數據結構生成的浮點列表,它是一個字典列表 - 即我遍歷整個列表並選擇給定字典中的某些值。現在,我想實際上對這些數據點做些什麼,爲此我需要對原始位置進行一些參考。我試圖簡單地使用數據點作爲關鍵,但在嘗試和失敗後,我做了一些挖掘,並意識到由於計算機的工作方式,浮點數沒有被精確表示。在Python中對浮點值進行索引

所以,我需要的是一些方法來在列表中指定一個唯一的值,以每個字典,如:

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

除了我顯然需要每個值唯一的項目分配給能夠指回到他們在列表對象中的位置。我在想象我可能會創建一個名爲「valuelist」的新對象,然後int,但是這看起來像是一種明顯的解決方法,我只是太難以理解了。

要重申一下,我想要的是一種方法,使數值指向它們在列表中的原始位置 - 在我的數據結構中,我的列表包含大量的字典,並且處理它的方式稍微複雜一些,所以我有點困惑於我可能不切實際的結構。

謝謝!

回答

2

首先,我們來解釋使用浮點造成的問題。

由於計算機的工作方式,浮點數並不能精確表示。

浮點數在計算機中精確表示。然而,存在一些限制:

  • 分辨率是有限的。在有限內存中表示無理數是不可能的,典型的浮點數只能表示幾十個數字。
  • 一些小數(base10)數字have no exact representation in binary。例如,0.1不能完全用基數2表示。在Python中運行"{0:.20f}".format(0.1)將返回0.10000000000000000555

現在,根據您的數字來源以及您想要執行的計算類型,有不同的可能的解決方案來索引它們。

對於可以用base10精確描述的數字,可以使用Decimal。這base10代表準確的數字:

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

如果你只與有理數處理(即使那些沒有準確的十進制表示),您可以使用fractions

請注意,如果您使用小數或分數,則需要儘快在處理中使用它們。從漂浮在後期轉換成十進制/分數擊敗他們的目的 - 你不能說是不存在的數據:

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

此外,使用小數或分數會在顯著的性能損失。最後,如果你的數字是不合理的,或者即使在使用小數或分數的情況下,你也會得到索引損失,你的最佳選擇可能是索引圓形版本的數字。如有必要,請使用bucketscollections.defaultdict可能對此有用。

你還可以保存一棵樹,或者使用binary search了一個自定義比較函數列表,但你不會有O(1)查找

+0

這看起來像我之後!我應該知道Python會爲此提供一個模塊。謝謝! – user3034187

1

如果我理解正確,您已經生成了浮動列表,每個浮動列表都來自原始列表中的一個字典。爲什麼不生成浮點列表,爲什麼不生成2元組列表,它是浮點數,它是相應的字典列表索引...

+0

這是我的嘗試開始,但在如何浮點值非常微小的不精確被分配,所以我得到keyerrors,如果我嘗試使用它們作爲字典鍵,例如。 e。 e。基本上,它遍歷第一個,比如,數百個值,然後找到某個值爲0.000000001或某個值並返回錯誤消息。 – user3034187