【问题标题】:Python Average, Max, Min from list列表中的 Python 平均值、最大值、最小值
【发布时间】:2017-12-15 07:33:52
【问题描述】:

所以我有一个这样的列表:

kesto = ['3m 24s', '45s', '1h 2m 40s']

我需要找到这些的平均值、最小值和最大值。 我试过了:

max_value = max(kesto)
min_value = min(kesto)
avg_value = sum(kesto)/len(kesto)

但当然它不起作用,因为这些不是数字。他们后面有“m”和“s”。

编辑: 此代码工作正常,但它只返回它获得的第一个值。 例如,如果有一个“h”和一个“m”,它只返回“h” 所以 1h 20min 和 1h 15min 都是“3600”。

            def parse_time(s):
                    s = s.split()
                    total = 0
                    for cl in s:
                            if cl[-1] == 'd':
                                total += int(cl[:-1]) * 60 * 60 * 24
                            if cl[-1] == 'h':
                                total += int(cl[:-1]) * 60 * 60
                            if cl[-1] == 'm':
                                total += int(cl[:-1]) * 60
                            if cl[-1] == 's':
                                total += int(cl[:-1])
                            return total
            kesto2 = [parse_time(s) for s in kesto]

【问题讨论】:

  • 3m 24s = 204 将它们转换为 int
  • 是的,我知道我必须将它们转换为 int 但如何?

标签: python list max average min


【解决方案1】:

创建一个将这些字符串转换为数字的函数,然后使用这个函数:

def conv(x):
    (m, s) = x.replace('m', '').replace('s', '').split()
    return 60 * int(m) + int(s)

max_value = max(kesto, key=conv)
min_value = min(kesto, key=conv)
avg_value = sum(map(conv, kesto))/len(kesto)

【讨论】:

    【解决方案2】:

    我建议您制作一个可以在几秒钟内转换您的值的函数。
    例如“3m 24s”是 204 秒。
    我帮你处理函数的签名:

    def converter(value):
    

    完成函数后,使用

    max_value = max(kesto, key=converter)
    min_value = min(kesto, key=converter)
    

    等等……

    【讨论】:

      【解决方案3】:
      s=0
      n = []
      for l in li:
         s = (60*int(l[0]))+int(l[3:4])
         n.append(s)
      

      n 是您想要的列表。

      【讨论】:

      • 请注意,我假设分钟数
      【解决方案4】:

      您可以使用strptime 解析这些条目,然后转换为timedelta 对象。这些可以被整数相加和相除:

      from datetime import datetime, timedelta
      
      NULL_TIMEDELTA = timedelta()
      kesto = ['3m 24s', '45s', '1h 2m 40s']
      
      def to_timedelta(strg):
          if 'h' in strg:
              tme = datetime.strptime(strg, '%Hh %Mm %Ss').time()
          elif 'm' in strg:
              tme = datetime.strptime(strg, '%Mm %Ss').time()
          else:
              tme = datetime.strptime(strg, '%Ss').time()
          dte = datetime.combine(datetime.min, tme)  # need a datetime object
          td = dte - datetime.min                    # to create timedelta object
          return td
      
      timedeltas = [to_timedelta(item) for item in kesto]
      max_value = max(timedeltas)
      min_value = min(timedeltas)
      avg_value = sum(timedeltas, NULL_TIMEDELTA)/len(timedeltas)
      
      print(max_value)  # 1:02:40
      print(min_value)  # 0:00:45
      print(avg_value)  # 0:22:16.333333
      

      注意你必须用NULL_TIMEDELTA = timedelta()初始化sum。默认为 0 - 但未定义 int + timedelta

      【讨论】:

        【解决方案5】:

        下面的代码将时间转换为秒并将它们添加到一个名为kestoS 的新列表中,因为它们都是相同的单位,现在您可以轻松地对它们进行排序。

        首先使用split() 分隔分钟,当看到'm' 时分隔列表。我只取第一个值,因此[0]。秒是通过将出现在空格之后的字符获取到“s”来获得的。最后,我计算秒数并将它们添加到kestoS

        此解决方案不受秒或分钟位数的限制。

        kestoS =[]
        for time in kesto:
            minutes = time.split('m')[0]
            seconds = time.[time.find(' ') + 1: time.find('s')]
            kestoS.append((minutes*60)+seconds)
        max_value = max(kestoS)
        min_value = min(kestoS)
        avg_value = sum(kestoS)/len(kestoS)
        

        【讨论】:

          【解决方案6】:

          希望这会有所帮助

          import re 
          kesto = ['3m 24s', '1m 5s', '2m 40s']
          kseto_total = []
          for k in kesto:
              # here split the two values and remove the m and s from string
              minuite,second =k.replace('m','').replace('s','').split(' ')
              # convert the string into int value
              minuite=int(minuite)
              second = int(second)
              # calculating the total value and append into the new list
              kseto_total.append(minuite*60+second)
          # applying max, min and calculate average
          max_value = max(kseto_total)
          min_value = min(kseto_total)
          avg_value = sum(kseto_total)//len(kseto_total)
          print(kesto)
          # printing the result into converting minute and secondd
          print(max_value//60,'m',max_value%60,'s\n',
                min_value//60,'m',min_value%60,'s\n',
                avg_value//60,'m',avg_value%60,'s')
          

          更新

          def format_string(time):
              k1 = ''
              k2 = ''
              k3 = ''
              if 'h' in time:
                  k1 = time
                  pass
              else:
                  k1 = '0h ' + k
              if 'm' in k1:
                  k2 = k1
                  pass
              else:
                  k2 = '0m ' + k1
              if 's' in k2:
                  k3 = k2
                  pass
              else:
                  k3 = ' 0s' + k2
              return k3
          

          这里调用字符串格式化函数。然后您可以按照评论描述进行操作。字符串格式化可以以有效的方式完成。这是唯一一个简单的解决方案。

          【讨论】:

          • 谢谢。这似乎是最好的答案。我在列表中有几个小时。
          • 所以应用数学计算和分割使用另一个.replace()作为你的字符串模式。快乐编码:)
          • 时、分、秒 =k.replace('h','').replace('m','').replace('s','').split(' ' ), ValueError: not enough values to unpack (expected 3, got 2) 它期望它在列表中的每个项目中都有 h、m、s。需要做一些 if 语句,这样它就不会出错,因为有些项目只有“s”或有“m”和“s”或有“h”和“m”和“s”跨度>
          • 在您的list 中,每个string pattern 都应该像这样2h 4m 12s。因为您将字符串拆分为三个值。
          • 他们不是:D。它们就像 ['1h 30m 2s', '43s', '40m 20s']
          【解决方案7】:

          这是我将字符串转换为可用秒值的第一部分的解决方案,认为它运作良好

          kesto = ['3m 24s', '45s', '1h 2m 40s']
          
          def parse_time(s):
              s = s.split()
              total = 0
              for cl in s:
                  if cl[-1] == 'h':
                      total += int(cl[:-1]) * 60 * 60
                  elif cl[-1] == 'm':     
                      total += int(cl[:-1]) * 60
                  elif cl[-1] == 's':
                      total += int(cl[:-1])
              return total
          
          kesto2 = [parse_time(s) for s in kesto] 
          

          结果为 kesto2 = [204, 45, 3760],以秒为单位。从那里你可以很容易地找到你的统计数据。

          【讨论】:

          • 有效。但对我来说,例如 8m 46s 是 480,而 8m 10s 是 480。
          • 刚刚试了一下,字符串 '8m 46s' 和 '8m 10s' 分别得到 526 和 490。你确定你复制的正确吗?
          • 在那里按下了标签:D。工作正常。抱歉给您添麻烦
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 2014-07-09
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 2012-04-13
          • 1970-01-01
          相关资源
          最近更新 更多