【问题标题】:How do I add dictionary individual key values together?如何将字典单个键值添加在一起?
【发布时间】:2021-03-14 10:59:54
【问题描述】:

我有一本字典,其中包含人员及其完成任务的持续时间。我也希望添加他们的个人时间。

office_time_dict = {
    "john": ["0:00:30", "0:02:04", "0:00:16"],
    "bryan": ["0:00:30", "0:02:04", "0:00:16"],
    "mike": ["0:00:30", "0:02:04", "0:00:16"],
}
total_time = 0

for k, v in office_time_dict.items():
    office = office_time_dict[k]
    for time in office:
        timeparts = [int(s) for s in time.split(":")]
        total_time += (timeparts[0] * 60 + timeparts[1]) * 60 + timeparts[2]
    total_time, sec = divmod(total_time, 60)
    hr, min = divmod(total_time, 60)
    print("%d:%02d:%02d" % (hr, min, sec))

当前输出:0:02:50、0:02:52、0:02:52

对我做错了什么感到困惑,因为 john、bryan 和 mike 的所有输出都应该是相同的,但是 bryan 和 mike 延迟了 2 秒

【问题讨论】:

  • 您必须将“total_time”的值重置为零,每次循环 k,v。
  • 这是出错的那一行:> 它保存了 [total_time] 变量中“2”的值,它传递给下一个循环犯了这个错误。

标签: python python-3.x dictionary time


【解决方案1】:

试试这个:

office_time_dict = {'john': ['0:00:30', '0:02:04','0:00:16'], 'bryan': ['0:00:30', 
                   '0:02:04','0:00:16'], 'mike' : ['0:00:30', '0:02:04','0:00:16']}

for person in office_time_dict:
    office = office_time_dict[person]
    total_time = 0 # re-initialise total_time for each person inside loop
    for time in office:
        timeparts = [int(s) for s in time.split(':')]
        total_time += (timeparts[0] * 60 + timeparts[1]) * 60 + timeparts[2]
    total_time, sec = divmod(total_time, 60)
    hr, min = divmod(total_time, 60)
    print('%d:%02d:%02d' % (hr, min, sec))

【讨论】:

    【解决方案2】:

    如果您将 HH:MM:SS-to-seconds(反之亦然)代码分解为它们自己的函数,您会过得更好:

    # Convert a h:m:s string to seconds
    def hms_to_sec(hms):
        h, m, s = [int(part, 10) for part in hms.split(":")]
        return h * 60 * 60 + m * 60 + s
    
    
    # Convert seconds to h:m:s
    def sec_to_hms(s):
        hm, s = divmod(s, 60)
        h, m = divmod(hm, 60)
        return "%02d:%02d:%02d" % (h, m, s)
    
    
    # Source data (slightly modified from question so the guys have different times)
    office_time_dict = {
        "john": ["0:00:30", "0:02:04", "0:00:16"],
        "bryan": ["0:00:20", "0:03:04", "0:00:16"],
        "mike": ["0:00:10", "0:04:04", "0:00:16"],
    }
    
    # Convert each person's time to seconds and sum up
    total_times_sec = {
        person: sum(hms_to_sec(time) for time in times)
        for (person, times) in office_time_dict.items()
    }
    
    # Convert the summed seconds back to H:M:S
    total_times_hms = {
        person: sec_to_hms(sec) for (person, sec) in total_times_sec.items()
    }
    
    # Sum the seconds and convert back to H:M:S
    grand_total_hms = sec_to_hms(sum(total_times_sec.values()))
    
    print(total_times_hms)
    print(grand_total_hms)
    

    打印出来

    {'john': '00:02:50', 'bryan': '00:03:40', 'mike': '00:04:30'}
    00:11:00
    

    【讨论】:

      【解决方案3】:

      在主循环之前,变量 total_time 只初始化了一次:

      total_time = 0
      

      在主循环的每次迭代之后,total_time 的值不是0,而是2
      然后将该值添加到命令中

      total_time += (timeparts[0] * 60 + timeparts[1]) * 60 + timeparts[2]
      

      如何纠正:

      将初始化移到主循环中:

      for k, v in office_time_dict.items():
          total_time = 0
      

      【讨论】:

        【解决方案4】:

        您只需将total_time 的初始化移动到循环内。 您也可以使用 items() 方法返回的值,而不是通过键访问字典。

        office_time_dict = {'john': ['0:00:30', '0:02:04','0:00:16'],
                            'bryan': ['0:00:30', '0:02:04','0:00:16'],
                            'mike' : ['0:00:30', '0:02:04','0:00:16']}
         
        for k, v in office_time_dict.items():
            total_time = 0
            for time in v:
                timeparts = [int(s) for s in time.split(':')]
                total_time += (timeparts[0] * 60 + timeparts[1]) * 60 + timeparts[2]
            total_time, sec = divmod(total_time, 60)
            hr, minutes = divmod(total_time, 60)
            print('%d:%02d:%02d' % (hr, minutes, sec))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-22
          • 2019-06-19
          • 1970-01-01
          • 2022-07-25
          • 1970-01-01
          • 2015-02-16
          • 2023-03-31
          • 1970-01-01
          相关资源
          最近更新 更多