2017-07-11 65 views
0

,所以我有一個這樣的名單: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,但是如何? –

回答

1

這是我的用於將字符串可用秒值的第一部分的解決方案,認爲它的工作原理以及

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

0

創建轉換這些字符串到數字的功能,然後使用此功能:

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) 
0

我建議你作出這樣的轉換在幾秒鐘內你的價值觀的功能。
例如「3m 24s」是204秒。
我幫助你的函數的簽名:

def converter(value): 

之後你完成的功能,使用

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

等等...

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

n是你想要的清單。

+0

請注意,我假定分鐘數<10m。 –

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

0

下面的代碼將時間轉換爲秒,並將它們添加到名爲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) 
1

希望這將有助於

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」 –

相關問題