2014-01-17 31 views
0

我使用Python 3.3.3。我想寫我的第二個Python程序(我的第一個有點困難的項目(對於新手)),它是一個包含用於視覺參考的象形圖的減肥跟蹤器。到現在爲止,我一直在努力。我遇到的問題是編寫一個函數,它將輸入int或float,然後將其分解成它的部分(10s,5s,1s和十分之一),準備與象形函數一起使用寫作。python打破數字在10s 5s 1s和.1s

我已經考慮過使用字典來存儲這些值只是爲了得到一些使用它們的做法。我不知道如何解決這個問題。如果除了使用字典還有更簡單的解決方案,請務必分享您的想法。

def get_digits(weight_entry): 
"""(int or float) -> (dict) 

Takes user input int or float weight_entry, and returns a populated dict 
separated in to tens, fives, ones, and tenths. 

>>>get_digits(279.6) 
{'tens': 27, 'fives': 1, 'ones': 4, 'tenths': 6} 
>>>get_digits(236.5) 
{'tens': 23, 'fives': 1, 'ones': 1, 'tenths': 5} 
>>>get_digits(224.2) 
{'tens': 22, 'fives': 0, 'ones': 4, 'tenths': 2} 
""" 
get_digits_dict = {'tens': 0, 'fives': 0, 'ones': 0, 'tenths': 0} 
digits_string = str(weight_entry) 
populate_tens = get_digits_dict['tens'] = int(digits_string[:2]) 

它被分解成幾十個這種方式的原因是因爲每個10對應於1,10個值的形狀。

你可以看到我已經嘗試將數字轉換爲一個字符串,然後使用切片來獲得我想要的部分,然後將其返回給一個int。我也試着把這些數字全部拿出來,把我的數字全部拿出來,留給我,而不是277.6,7.6,從中我可以嘗試做一些簡單的數學來獲得我需要的數據。從7.6我需要得到的是一個五,兩個,六個十分之一。

我的輸出,除了時間戳我打算添加,是應該站出來爲這樣:

265.0□□□□□□□□□□□□□□□□□□□□□ □□□□□▪

263.0□□□□□□□□□□□□□□□□□□□□□□□□□□▫▫▫

260.0□□□□□ □□□□□□□□□□□□□□□□□□□□□

259.0□□□□□ □□□□□□□□□□□□□□□□□□□□▪▫▫▫▫

256.0□□□□□□□□□□□□□□□□□□□□ □□□□□▪▫

257.0□□□□□□□□□□□□□□□□□□□□□□□□□▪▫▫

254.0□□□□□ □□□□□□□□□□□□□□□□□□□□▫▫▫▫

251.0□□□□□□□□□□□□□□□□□□□□□ □□□□▫

249.0□□□□□□□□□□□□□□□□□□□□□□□□▪▫▫▫▫

245.6□□□□□□□□□□□□ □□□□□□□□□□□□▪∙∙∙∙∙∙∙

244.3□□□□□□□□□□□□□□□□□□□□□□□□▫▫ ▫▫∙∙∙

244.1□□□□□□□□□□□□□□□□□□□□□□□□▫▫▫▫∙

239.7□□□□□□ □□ □□□□□□□□□□□□□□▪▫▫▫▫∙∙∙∙∙∙∙

我是一個系統化的生物,所以很自然我想下一步在5秒。那麼,如果有五個,我可以假設只有一個五個,並且只有當文字數字在5到9之間時,這五個纔會存在。在5s之後,將被用來捕捉這些數字,當然,小數點後的多餘部分是十分之一。我的主要問題是找到五個,然後是多餘的。

我想我只是有點沮喪和沮喪,因爲這是一種超出我的聯盟,但那只是我,我正試圖通過從我的範圍之外的東西學習加強。我會花更多的時間試圖編寫這個函數,但是我覺得我會從不弄清楚,有人向我展示,然後分析我錯誤發現的所有地方,從中學到更多東西。

任何幫助都將不勝感激。如果你讀到這裏,我也很感激。


WOW所以信息,所有的人。我曾想過使用floor division和/或modulo,但我無法弄清楚如何得出確切的結果。如果我有代表+1的話,我會的。在完成我的程序後,我會選擇與我打算完成的最接近的答案,儘管我可能會綜合使用每個人的答案以產生最終結果。感謝您幫助我學習。

獲得五個,並且超出的那些被證明是麻煩分離。以及小數的精度使得整體難以理解。感謝所有貢獻者。

+1

我想你可以:除以10取整數部分,除以5取餘數,取整數部分,除以1(hah)取整數部分,除以0.1餘數取整數部分。 – towr

+0

好吧,我想我只是在想。謝謝。 –

回答

0

這是一個使用模運算符和整數除法的解決方案。我相乘,然後將數字除以10,以便我可以準確地得到十分之一(並且如果通過將它作爲10倍時的整數給出,則擺脫任何額外的精度)。

在開始時,我設置了一個元組列表,以便我知道每個字符串的含義,然後我可以遍歷列表中的所有元組。

values = [('tens', 10), ('fives', 5), ('ones', 1), ('tenths', 0.1)] 


def get_digits(num): 
    num = int(num * 10) 
    num = float(num)/10 

    output_dict = {} 
    for place, value in values: 
     output_dict[place] = num // value 
     num = num % value 
    return(output_dict) 

get_digits(123.456) 

輸出:

{'fives': 0.0, 'tens': 12.0, 'tenths': 4.0, 'ones': 3.0} 

這是一個很酷的可視化工具,可以幫助您瞭解,如果你在上面的代碼粘貼正在生成這裏的字典:http://pythontutor.com/visualize.html

2

您可以使用Python //運算符執行此任務。

您可以在此答案中閱讀有關操作員:
Python 3 integer division. How to make math operators consistant with C)。

n = 749.65 

tens = n // 10 
n = n - 10 * tens 

fives = n // 5 
n = n - 5 * fives 

ones = n // 1 
n = n - 1 * ones 

tenths = n // .1 
n = n - .1 * tenths 

remainder = n 

這應該給你以下。

tens = 74 
fives = 1 
ones = 4 
tenths = 6 
remainder = .05 

由於不精確的計算,結果可能會稍微偏離。如果這是一個問題,你可以使用基數10而不是基數2;代替地使用n = Decimal("749.65")。閱讀更多關於Decimal這裏:http://www.python.org/dev/peps/pep-0327/#abstract

+0

不會使用'n = n%10'比'n = n - 10 * ten'更有效嗎? (除非'''比'*'更難?) – towr

+0

@towr你絕對可以按照你的建議去做。 (我不知道它是否更有效率。)我只是走這條路,因爲我認爲它有點容易理解。 –

1

您可以使用greedy algorithm進行更改。這是我如何會封裝成一個基本功能:

def get_digits(weight_entry): 
    out = {} 
    entries = ('tens',10),('fives',5),('ones',1),('tenths',.1) 
    for word,num in entries: 
     out[word] = weight_entry // num 
     weight_entry %= num 
    return out 

演示

get_digits(116.4) 
Out[53]: {'fives': 1.0, 'ones': 1.0, 'tens': 11.0, 'tenths': 4.0} 

需要注意的是浮點運算,可奇怪:

get_digits(114.3) 
Out[54]: {'fives': 0.0, 'ones': 4.0, 'tens': 11.0, 'tenths': 2.0} 

很可能失去的十分之一由於舍入錯誤。您可以通過多種方式進行更正,例如:

def get_digits(weight_entry): 
    out = {} 
    entries = ('tens',10),('fives',5),('ones',1),('tenths',.1) 
    for word,num in entries: 
     out[word] = weight_entry // num 
     weight_entry %= num 
    if round(weight_entry,1): #correction for floating-point error 
     out['tenths'] += 1 
    return out 
+0

這很有趣,基本上是一樣的。 = /我通過乘以然後除以10來校正,但是你的方式可能更清楚。 –

相關問題