Python 列表中的平均值、最大值、最小值
Python Average, Max, Min from list
所以我有一个这样的列表:
kesto = ['3m 24s', '45s', '1h 2m 40s']
我需要找到这些的平均值、最小值和最大值。
我试过:
max_value = max(kesto)
min_value = min(kesto)
avg_value = sum(kesto)/len(kesto)
但这当然行不通,因为这些不是数字。他们后面有 "m" 和 "s"。
编辑: 这段代码工作正常,但它只 returns 它获得的第一个值。
例如,如果有一个 "h" 和一个 "m" 它 returns 只有 "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]
创建一个将这些字符串转换为数字的函数,然后使用此函数:
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
是您想要的列表。
您可以使用 strptime
and then convert to 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
。
下面的代码将时间转换为秒并将它们添加到名为 kestoS
的新列表中,因为它们都是相同的单位,现在您可以轻松地对它们进行排序。
首先,使用 split()
分隔会议记录,当看到 'm' 时,它会分隔列表。因此我只取第一个值 [0]
。秒数是通过取 space 到 '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] 这是以秒为单位的时间。从那里你可以很容易地找到你的统计数据。
所以我有一个这样的列表:
kesto = ['3m 24s', '45s', '1h 2m 40s']
我需要找到这些的平均值、最小值和最大值。 我试过:
max_value = max(kesto)
min_value = min(kesto)
avg_value = sum(kesto)/len(kesto)
但这当然行不通,因为这些不是数字。他们后面有 "m" 和 "s"。
编辑: 这段代码工作正常,但它只 returns 它获得的第一个值。 例如,如果有一个 "h" 和一个 "m" 它 returns 只有 "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]
创建一个将这些字符串转换为数字的函数,然后使用此函数:
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
是您想要的列表。
您可以使用 strptime
and then convert to 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
。
下面的代码将时间转换为秒并将它们添加到名为 kestoS
的新列表中,因为它们都是相同的单位,现在您可以轻松地对它们进行排序。
首先,使用 split()
分隔会议记录,当看到 'm' 时,它会分隔列表。因此我只取第一个值 [0]
。秒数是通过取 space 到 '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] 这是以秒为单位的时间。从那里你可以很容易地找到你的统计数据。