python将数字分成10s 5s 1s和.1s

时间:2014-01-17 20:35:10

标签: python function numbers

我使用的是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,我会的。在完成我的课程后,我将选择最接近我想要完成的答案,尽管我可以结合使用每个人的回答来得出最终结果。谢谢你帮我学习。

获得五个,而多余的那些被证明很难分离。除了十进制的精度之外,很难弄清楚整体。感谢所有贡献者。

4 个答案:

答案 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")。在此处详细了解Decimalhttp://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