Python的平均值,最大值,最小值从列表

Python的平均值,最大值,最小值从列表

问题描述:

,所以我有一个这样的名单:Python的平均值,最大值,最小值从列表

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” 因此1小时20分钟和1小时15分钟将是“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] 
+1

'3m 24s = 204'将它们转换为int – ksai

+0

是的我知道我必须将它们转换为int,但是如何? –

这是我的用于将字符串可用秒值的第一部分的解决方案,认为它的工作原理以及

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],它是在几秒钟的时间。从那里你可以很容易地找到你的统计数据。

+0

的作品。但对我来说,例如8m 46s是480和8m 10s是480. –

+0

所以它的工作原理。但它不像你说的那样工作:D –

+0

刚刚尝试过,并且分别获得了字符串'8m 46s'和'8m 10s'的526和490。你确定你把它正确地复制了吗? – couragewolf

创建转换这些字符串到数字的功能,然后使用此功能:

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) 

我建议你作出这样的转换在几秒钟内你的价值观的功能。
例如“3m 24s”是204秒。
我帮助你的函数的签名:

def converter(value): 

之后你完成的功能,使用

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

等等...

s=0 
n = [] 
for l in li: 
    s = (60*int(l[0]))+int(l[3:4]) 
    n.append(s) 

n是你想要的清单。

+0

请注意,我假定分钟数

您可以用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 

注意您必须初始化sumNULL_TIMEDELTA = timedelta()。缺省值为0 - 但未定义int + timedelta

下面的代码将时间转换为秒,并将它们添加到名为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) 

希望这将有助于

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 

在这里,您拨打的字符串格式化功能。然后你可以像评论所描述的那样使用oparate。字符串格式化可以高效地完成。这是唯一一个简单的解决方案。

+0

谢谢。这似乎是最好的答案。我在名单上有好几个小时。 –

+0

所以应用数学计算和分割使用另一个'.replace()'作为你的字符串模式。快乐编码:) –

+0

小时,分钟,秒= k.replace('h','')。replace('m','')。replace('s','')。split(''), ValueError:没有足够的值解压缩(预计3,得到2) 它期望它在列表中的每个项目中都有h,m,s。需要做某种if语句,所以它不会给出错误,因为有些项目只有“s”或者有“m”和“s”,或者有“h”和“m”和“s” –