我使用的是Python 3.3.3。我正在尝试编写我的第二个Python程序(我的第一个有点困难的项目(对于新手)),它是一个减肥跟踪器,其中包括一个用于视觉参考的象形图。到目前为止,我已经做好了一切。我遇到的问题是编写一个函数,它将输入int或float,然后将其分解为其部分(10s,5s,1s和tenths),准备与象形图函数一起使用我将是写入。
我考虑使用字典来存储这些值,只是为了让它们使用它们。我不知道如何处理这个问题。如果除了使用字典之外还有一个更简单的解决方案,请务必分享您的想法。
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□□□□□□□□□□□□□□□□□□□□□□□▪∙∙∙∙∙∙∙∙
我是一个系统的生物,所以我很自然地希望接下来做5s。好吧,我可以假设如果有五个就只有一个五个,并且只有当文字中的数字放在5到9之间时才有五个。在5s之后,任何多余的地方当然,它将用于捕获那些,十进制之后的过量是十分之一。我的主要问题是找到五个,然后是那些过剩的。
我想我只是有点不知所措和沮丧,因为这有点超出我的联盟,但这只是我,我正试图通过学习我无法触及的事物来加强。我会花更多的时间来尝试编写这个函数,但我觉得我会从不弄清楚,有人向我展示,然后只是分析我错误的所有地方中学到更多。
任何帮助都将非常感谢。如果你读到这里,我也很感激。
WOW 所有人都如此翔实。我曾想过使用地板划分和/或模数,但我无法弄清楚如何得出确切的结果。如果我让代表给你+1,我会的。在完成我的课程后,我将选择最接近我想要完成的答案,尽管我可以结合使用每个人的回答来得出最终结果。谢谢你帮我学习。
获得五个,而多余的那些被证明很难分离。除了十进制的精度之外,很难弄清楚整体。感谢所有贡献者。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
https://en.wikipedia.org/wiki/Change-making_problem - 试试这个,至少有两个解决方案。
答案 3 :(得分: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