2014-10-29 69 views
1

我正在嘗試創建一個能夠平均車速的python程序。然而,他們是不同的道路,這種速度可以找到(這些都是數字0-9表示)文件可以有任何道路號碼,可以是任何速度。Python文件,取文件並找到平均值

Example1.txt 
0 40km 
1 30km 
0 67km 
2 45km 
2 23km 

我想創建與走輔路的平均

average of 1 = 30 
average of 0 = 35 

等,文件可以包含然而,許多配對和道路將是數字0-9 這之間的程序我到目前爲止:

def traffic_summary(filename): 
    in_file = open(filename) 
    lines = in_file.readlines() 
    in_file.close() 
    return lines 

def calc_traffic_avg(lines): 
# Find out how long the file is 
    total_lines = len(lines) 

# For every file line, find the charity and the amount contributed 
    avg = 0  # Nums + however many/How ever many integers there are 
    road_nums = [] 
    master = [] 
    road_speeds = [] 
    for i in range(1, total_lines):  # Omits the title lines 
     current_line = lines[i].rstrip("\n")  #Removes the new line 
     current_line = current_line.split() 

     for j in range(len(current_line)): 
      current_word = current_line[j] 

      if "km" in current_word: 
       position = j 
       amount = int(current_word.rstrip('km')) 
       road_speeds.append(amount) 
      if not "km" in current_word: 
       road_nums.append(int(current_word)) 
    print(road_nums, road_speeds) 

我需要弄清楚如何平均道路上的速度數量。

+0

你究竟想知道什麼?要找到平均值,您需要爲特定道路加上所有不同的速度,然後除以構成總和的那些速度。 – martineau 2014-10-29 01:35:42

回答

1

collections.defaultdictcollections.Counter將是有益的:

from collections import defaultdict,Counter 
d = defaultdict(float) 
count = Counter() # get count of all times the road appears in the file 
with open("in.txt") as f: 
    for line in f: 
     rd, speed = line.rstrip().split() 
     d[rd] += float(speed.rstrip("km")) # sum km for each road/key 
     count.update(rd) 

for k, v in d.items(): 
    print("Road {} average = {}".format(k,v/count[k])) # divide sum by times road appears 

Road 1 average = 30.0 
Road 0 average = 53.5 
Road 2 average = 34.0 
+0

+1,需要跳過第一行,否則程序失敗 – radar 2014-10-29 01:55:49

+0

@RADAR,我在第一行沒有看到任何頭文件,所有文件的名稱都是? – 2014-10-29 01:57:07

2

你需要做的是保持跟蹤所有速度的每條道路的,而不僅僅是一個所有速度的名單和所有道路的列表。

這樣做的一種方法是用字典:鍵是道路,值是該路的速度列表或設置*。您可以使用collections.defaultdict(list)(或…(set))來輕鬆構建。

但是,您還需要知道每個速度與哪條路相符。你寫的東西的方式,你只是把每個單詞當作一個完全獨立的東西,忽略它們成對出現的事實(以及其他有用的東西,比如每行上總是隻有一對),這意味着你無法知道哪個與哪個一起發生。

如果文件格式真的如描述的那樣,可以讓這個簡單了很多:不是遍歷current_line,用事實current_line[0]是道路,current_line[1]是速度。就像這樣:

road_speeds = collections.defaultdict(list) 

# ... 

    # ... inside the loop 

    road, speed = current_line.split() 
    road = int(road) 
    speed = int(speed.rstrip('km')) 
    road_speeds[road].append(speed) 

現在,當你完成了整個事情,你就會有一本字典,看起來是這樣的:

{0: [40, 67], 2: [45, 23], 1: [30]} 

那麼,你如何得到的平均速度爲每路?

for road, speeds in road_speeds.items(): 
    average_speed = sum(speeds)/len(speeds) 
    print(road, average_speed) 

需要注意的是,如果你有Python的3.4+,你可能會發現它更可讀或明確使用statistics.mean而不是由len劃分sum


*您如何知道是否使用set或list?基本上,如果對重複的處理有不同的概念意義,或者考慮條目的順序有意義,那麼你有一個列表;否則,你有一套。在這種情況下,如果在同一條路上有兩次相同的速度,您仍然可能想要考慮它們不同的行程,因爲DSM指出,所以列表可能更有意義。

+1

'set'真的是個好主意嗎?如果以相同的速度進行兩次旅行會怎樣? – DSM 2014-10-29 01:41:44

+0

@DSM:好點;編輯。謝謝。 – abarnert 2014-10-29 19:03:59