秒数转时间分量时,如何实现英文规范的混合分隔格式?
问题解决:秒数转换为规范时间表述
问题描述
我正在完成一项编程练习,要求输入秒数后返回转换后的年、天、小时、分钟、秒的时间表述。规则是各分量用", "分隔,最后一个分量用" and "连接(符合英文书写规范)。但当前代码只能统一用" and "连接所有分量(比如生成“2 days and 4 hours and 56 minutes and 4 seconds”),尝试用计数器统计逗号和and的数量却没法正确添加到对应位置,求解决方案。
原代码如下:
def format_duration(seconds): result = [] counter = 0 if seconds == 0: print('now') return 'now' final_years = int(seconds/31536000) final_days = (int(seconds/86400))%365 final_hours = (int(seconds/3600))%24 final_minutes = (int(seconds/60))%60 final_seconds = seconds%60 returning(final_years,' year',result) returning(final_days,' day',result) returning(final_hours,' hour',result) returning(final_minutes,' minute',result) returning(final_seconds,' second',result) print(' and '.join(result)) return ' and '.join(result) def returning(time,name,array): if time > 0: if time == 1: array.append(str(time)+name) if time > 1: name += 's' array.append(str(time)+name) format_duration(190564)
解决方案
核心是根据结果列表的长度动态处理连接逻辑,不需要额外计数器,直接通过列表切片实现:
修改后的完整代码:
def format_duration(seconds): result = [] if seconds == 0: print('now') return 'now' final_years = int(seconds/31536000) final_days = (int(seconds/86400))%365 final_hours = (int(seconds/3600))%24 final_minutes = (int(seconds/60))%60 final_seconds = seconds%60 returning(final_years,' year',result) returning(final_days,' day',result) returning(final_hours,' hour',result) returning(final_minutes,' minute',result) returning(final_seconds,' second',result) # 动态处理连接逻辑 if len(result) == 1: output = result[0] else: # 前n-1个用逗号连接,最后一个用and连接 output = ', '.join(result[:-1]) + ' and ' + result[-1] print(output) return output def returning(time,name,array): if time > 0: if time == 1: array.append(str(time)+name) elif time > 1: # 改成elif避免逻辑冗余 name += 's' array.append(str(time)+name) format_duration(190564)
关键修改说明
- 移除无用变量:删掉了没用到的
counter变量 - 结果拼接逻辑优化:
- 当结果列表只有1个元素时,直接返回该元素
- 当列表有多个元素时,用
,连接前n-1个元素,再和最后一个元素用and拼接,完全符合英文书写规范
- 小细节优化:把
returning函数里的第二个if改成elif,避免时间等于1时多余的判断,逻辑更严谨
测试format_duration(190564)会输出:2 days, 4 hours, 56 minutes and 4 seconds,符合要求。
内容的提问来源于stack exchange,提问作者damoN
相关产品推荐
相关产品推荐

