2013-04-29 63 views
2

我有3个列表,一个小时,一个分钟,一个秒。我所做的是创建一个函数,将3个列表作为输入并计算总时间。将时间列表转换为总时间

我的问题是,功能是如此多余,我的问题是简单:什么是更好的方法来做到这一点。

这里是我的功能:

def final_time(hours,minutes,seconds): 
    draft_hours = sum(hours) 
    draft_minutes = sum(minutes) 
    draft_seconds = sum(seconds) 
    adding_seconds = str(draft_seconds/60.0) 
    second_converting = adding_seconds.split(".") 
    seconds_to_minutes = int(second_converting[0]) 
    seconds_to_seconds = draft_seconds - (seconds_to_minutes * 60) 
    total_seconds = str(seconds_to_seconds) 
    more_minutes = draft_minutes + seconds_to_minutes 
    adding_minutes = str(more_minutes/60.0) 
    minute_converting = adding_minutes.split(".") 
    minutes_to_hours = int(minute_converting[0]) 
    minutes_to_minutes = more_minutes - (minutes_to_hours * 60) 
    total_minutes = str(minutes_to_minutes) 
    total_hours = str(draft_hours + minutes_to_hours) 
    return total_hours + " hours, " + total_minutes + " minutes, and " + total_seconds + " seconds." 

这里有一个例子:

my_hours = [5, 17, 4, 8] 
my_minutes = [40, 51, 5, 24] 
my_seconds = [55, 31, 20, 33] 
print final_time(my_hours,my_minutes,my_seconds) 

以上的回报:

36 hours, 2 minutes, and 19 seconds. 

所以它的工作,但你可以看到,函数只是不是pythonic或高效函数... 什么是更好的方法?

+2

即开始的问题,“*所以它的工作*”为更好地要求在http://codereview.stackexchange.com – 2013-04-29 17:18:36

回答

6
s = sum(hours)*3600+sum(minutes)*60+sum(seconds) 
return '%d hours %d minutes %d seconds'%(s/3600, (s%3600)/60, s%60) 
+0

我喜欢你的转换,以秒比我更多。我认为'小时','分钟'和'秒'中有相同数量的元素,但我想我没有看到任何理由为什么总是这样。 (1) – mgilson 2013-04-29 17:09:23

3
def HMSToSeconds(H,M,S): 
    return H*3600 + M * 60 + S 

def SecondsToHMS(seconds): 
    hours,seconds = divmod(seconds,3600) 
    mins,seconds = divmod(seconds,60) 
    return hours,mins,seconds 

def final_time(hours,minutes,seconds): 
    draft_hours = sum(hours) 
    draft_minutes = sum(minutes) 
    draft_seconds = sum(seconds) 
    total_seconds = HMSToSeconds(draft_hours,draft_minutes,draft_seconds) 
    return SecondsToHMS(total_seconds) 
4

我想这一切首先可能转换到秒:

seconds = sum(3600*h + 60*m + s for (h,m,s) in zip(hours,minutes,seconds) 

现在打破它背下来:

n_hours,minutes = divmod(seconds,3600) 
n_minutes,n_seconds = divmod(minutes,60)