列表中的Python平均值、最大值、最小值

列表中的Python平均值、最大值、最小值,python,list,max,average,min,Python,List,Max,Average,Min,所以我有这样一个列表: kesto = ['3m 24s', '45s', '1h 2m 40s'] 我需要找到这些的平均值,最小值和最大值。 我试过: max_value = max(kesto) min_value = min(kesto) avg_value = sum(kesto)/len(kesto) 但当然这不起作用,因为这些不是数字。他们后面有“m”和“s” EDIT:这段代码工作正常,但它只返回它得到的第一个值。 例如,如果有一个“h”和一个“m”,则只返回“h” 因此,1小

所以我有这样一个列表:

kesto = ['3m 24s', '45s', '1h 2m 40s']
我需要找到这些的平均值,最小值和最大值。 我试过:

max_value = max(kesto)
min_value = min(kesto)
avg_value = sum(kesto)/len(kesto)
但当然这不起作用,因为这些不是数字。他们后面有“m”和“s”

EDIT:这段代码工作正常,但它只返回它得到的第一个值。 例如,如果有一个“h”和一个“m”,则只返回“h” 因此,1小时20分钟和1小时15分钟都是“3600”


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

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 24秒”是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
是您想要的列表。

您可以使用解析这些条目,然后将其转换为对象。它们可以被整数加和除:

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\u TIMEDELTA=TIMEDELTA()
初始化
sum
。默认值为
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

在这里,您可以调用用于字符串格式化的函数。然后你就可以像评论所描述的那样遮遮掩掩了。字符串格式化可以高效地完成。这是唯一一个简单的解决方案。

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

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],以秒为单位。从那里你可以很容易地找到你的统计数据。

<3m 24s=204将它们转换为int是的,我知道我必须将它们转换为int,但是如何转换?请注意,我假设了分钟数,谢谢。这似乎是最好的答案。我的列表中有小时数。因此,应用数学进行计算和拆分,使用另一个
.replace()
作为字符串模式。快乐编码:)时、分、秒=k.replace('h','').replace('m','').replace('s','').split(''),ValueError:没有足够的值来解包(预期3,得到2)它预期列表中的每个项目都有h,m,s。需要执行某种if语句,这样它就不会出现错误,因为某些项在
列表中只有“s”或“m”和“s”或“h”和“m”和“s”
每个
字符串模式都应该是这样的
2h 4m 12s
。因为您将字符串拆分为三个值。它们不是:D。它们像['1h 30m 2s'、'43s'、'40m 20s']有效。但对于我来说,例如8m 46s是480,8m 10s是480。刚刚尝试过,字符串'8m 46s'和'8m 10s'分别得到526和490。你确定复制的正确吗?按了那里的制表符:D。工作正常。很抱歉给你添麻烦
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]