2014-05-16 27 views
1

我有一段代碼創建了一個字典Enzyme_dict,然後用對象填充字典(來自class Enzyme)。該類對象的屬性之一本身就是一個字典(self._specif)。構成該屬性的字典填充了多個值,全部等於1.0/5。由於機器的精度,這個值被打印爲0.20000000000000001,這使得打印字典中的許多這些值是不可讀的。在Python中的對象中格式化字典

我希望能寫print Enzyme_dict並讓它將所有機器舍入的浮點值打印爲.200或其他內容,而不是笨拙的0.20000000000000001。我怎樣才能做到這一點?

當我嘗試使用%.3f在類本身中格式化__repr__輸出時,它告訴我我不能這樣做,因爲我試圖將字典格式化爲浮點(這很合理)。我還想保留那些我試圖截斷爲浮動的值,而不是將它們變成字符串。

我正在運行python 2.6.6。感謝您的幫助!

import random 
random.seed(5) 

numb_unique_chem = 10 
numb_rxns = 10 
numb_sub = 2 
numb_prod = 2 
E_pool_size_initial = 3 
numb_rxns_cat_initial = 5 

class Enzyme(object): 
    def __init__(self,rxns_cat,specif): 
     self._rxns_cat = rxns_cat 
     self._specif = specif  
    def __repr__(self): 
     return "Rxns catalyzed: %s, Specificity: %s \n" %(self._rxns_cat, self._specif) 

Enzyme_dict = {} 

R_pool_size = 10 # Rxn pool size, dictated by the input above 
for ID in range(E_pool_size_initial): 
    Enzyme_dict[ID] = Enzyme([],{}) 
    Enzyme_dict[ID]._rxns_cat = random.sample([n for n in range(10)],numb_rxns_cat_initial) 

    Enzyme_dict[ID]._specif = {} 
    for i in Enzyme_dict[ID]._rxns_cat: 
     Enzyme_dict[ID]._specif[i] = (1.0/len(Enzyme_dict[ID]._rxns_cat)) 

print Enzyme_dict 
+1

爲什麼不翻翻字典,'.items()'和格式,並打印迭代每個鍵/值對都是你自己的? – OdraEncoded

+0

你不想格式化*字典*爲3 d.p. 'float',你想以這種方式格式化*值*。此外,'__repr__'不應該像那樣使用,使用'__str__' - 請參閱http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – jonrsharpe

+1

我無法重現它在Python 2.7.6中:'python -c'print repr(1.0/5)''打印'0.2'。升級選項? (我強烈推薦它,2.7.6是一個巨大的改進。)你也可以嘗試'循環(1.0/len(Enzyme_dict [ID] ._ rxns_cat),3)' –

回答

0

由於OdraEncoded建議,你可以簡單地調整你的再版()方法來打印以下:

def __repr__(self): 
     return "Rxns catalyzed: %s, Specificity: %s \n" %(self._rxns_cat, ['%.3f' % spec for spec in self._specif])