首页 > 编程问答 >我在 Python 时间格式化函数中遇到代码问题

我在 Python 时间格式化函数中遇到代码问题

时间:2024-07-21 09:17:23浏览次数:12  
标签:python logic

我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:

def make_readable(seconds):
    if seconds < 60:
        s1 = seconds
        h1, m1 = (0,0)
        return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"
    else:
        h0 = seconds / 3600

        h1 = int(h0)
        m0 = (h0 - int(h0)) * 60
        m1 = int(m0)
        s0 = (m0 - int(m0)) * 60
        s1 = int(s0)

        return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"

这是我正在运行的测试用例:

import codewars_test as test

@test.describe("Fixed Tests")
def fixed_tests():
    @test.it('Basic Test Cases')
    def basic_test_cases():
        test.assert_equals(make_readable(0), "00:00:00")
        test.assert_equals(make_readable(59), "00:00:59")
        test.assert_equals(make_readable(60), "00:01:00")
        test.assert_equals(make_readable(3599), "00:59:59")
        test.assert_equals(make_readable(3600), "01:00:00")
        test.assert_equals(make_readable(86399), "23:59:59")
        test.assert_equals(make_readable(86400), "24:00:00")
        test.assert_equals(make_readable(359999), "99:59:59")

大多数测试用例通过,但这两个失败:

test.assert_equals(make_readable(86399), "23:59:59")
test.assert_equals(make_readable(359999), "99:59:59")

这些测试用例的输出是:

'23:59:58' should equal '23:59:59'
'99:59:58' should equal '99:59:59'

I期望该函数为所有输入返回正确的时间格式。该函数在大多数测试用例中都能正常工作,但在输入为 86399 和 359999 秒的情况下会失败,返回的时间比预期少一秒。

我不确定为什么我的函数关闭了一秒在这些具体情况下。任何有关如何解决此问题的建议或见解将不胜感激。

提前致谢!


此问题源于使用浮点算术的精度问题。当执行类似 h0 = seconds / 3600 的操作时,结果是一个浮点数,而浮点数的表示方式可能并不总是精确的,尤其是在执行算术运算时。

以下是对的代码进行更正以解决此问题的替代方法,而无需依赖浮点算术:

def make_readable(seconds):
    h1 = seconds // 3600
    m1 = (seconds % 3600) // 60
    s1 = seconds % 60
    return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"

此代码执行以下操作:

  1. 计算小时数:
  2. h1 = seconds // 3600 使用整除(//)来确定小时数,从而避免了浮点运算。

  3. 计算分钟数:

  4. m1 = (seconds % 3600) // 60 首先使用模运算符(%)来获取剩余的秒数(在除以 3600 之后),然后将其除以 60 来计算分钟数。

  5. 计算秒数:

  6. s1 = seconds % 60 使用模运算符(%)来获取剩余的秒数(在除以 60 之后)。

  7. 返回格式化的时间:

  8. 最后,使用 f-string 将小时数、分钟数和秒数组合在一起,使用 zfill(2) 来确保每部分都至少包含两个数字。

通过使用此方法,可以避免浮点精度问题并获得所有测试用例的正确时间格式。

标签:python,logic
From: 78774206

相关文章

  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......
  • 《流畅的Python》第二版 第12章
       fromarrayimportarrayimportmathimportfunctoolsimportitertoolsimportoperatorimportreprlibclassVector:typecode='d'def__init__(self,components):self._components=array(self.typecode,components)......
  • 如何在Python中给jupyter单元标准输入?
    我正在尝试在接受用户输入的jupyter笔记本上运行一个程序,但我不知道如何让它读取标准输入。例如,如果我使用shift-enter:a=input()print(a)运行代码,则单元格指示它正在运行,但不接受我的输入。我如何让它接受输入?你遇到的问题是Jupyternotebook中的代码单元默认......
  • Python:如何从 csvreader 列表中删除括号和单引号?
    Pythonn00b在这里。尝试使用csvreader从文件导入数组并打印一个值,但它添加了括号和单引号。这是我的代码:importrandomimportcsvwithopen('crimes.csv','r')ascsvfile:crimes=list(csv.reader(csvfile))hello=["Hello","Greetings","Hi&q......
  • Python 中的多行输入,支持空行并在控制台中检查“\n”
    您好,亲爱的社区,在解决某个竞赛任务时出现了问题。我解决了它,但由于输入棘手而无法交付。我在谷歌上搜索并尝试了几种找到的方法,但如果应用于此任务,它们中的每一种都有一些弱点。而且我无法完全重现所应用的输入,因为它嵌入在竞赛界面中;我可能只依赖描述。这就是为什么我......
  • Python Pandas - 读取 CSV 或 Excel
    我允许用户上传CSV或Excel文件。我正在使用pandas读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将pd.read_csv()和pd.read_excel()包装在try/except块中。ifform.validate_on_submit():input_filename=secure_filename(form.file.da......
  • 如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?
    我正在尝试在网络驱动器之间移动多个大文件夹(>10Gb、>100个子文件夹、>2000个文件)。我尝试过在python中使用Shutil.copytree命令,它工作得很好,只是由于不同的原因它无法复制一小部分(<1%的文件)。我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过......
  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......
  • python 中的可扩展视频文件完整性验证
    我的目录包含约100万个视频文件,嵌套在100个子目录下。我想编写一个python脚本来验证这些文件没有损坏,然后删除损坏的文件。做到这一点最有效的方法是什么?它运行的机器有64个cpu核心。当然,以下是如何在Python中构建可扩展视频文件完整性验证器的步骤,该验证器可以......
  • Python:对很高维的矩阵进行对角化?
    目前我正在研究一个涉及对角化矩阵以获得特征值和特征向量的问题。但现在我想将问题扩展到200,000x200,000的尺寸。我查找了如何将矩阵存储在numpy中,有人建议使用PyTables。看起来很有希望。但我想知道哪里有工具可以帮助对PyTables中的矩阵存储进行对角化。......