作業四
Jump to Section
說明:
-
輸入
每個檔案總共 $N$ 行,$N$ 為正整數,$1 \leq N < 1000$。
每行資料包含兩個值 $p$, $i$,以單一半形空格相接。
$p$ 代表購買人姓名,$i$ 代表購買物品,此二值可能包含中文或英文,保證期間無空白存在。 -
輸出
請根據不同購買者分別建立以其姓名為檔名之文字檔。
每個檔案中有數行,每行包含兩個值 $i$ 與 $c$,中間以單一半形空格相接。
$i$ 為該購買者所購買之物品,$c$ 為與該物品總購買數量。
小題1
成品及時展示:
思路說明
使用Counter模組。讀取檔案內容後,使用.split("\n")得到檔案中每一行的陣列,再用.split()將每一行內容用空白分開。接者,將相同人名的物件放在同一個陣列中,在from collections import Counter後使用Counter(arr)得到計數結果,並儲存此結果到檔案中。
def read_data(path):
with open(path) as f:
data = f.read().rstrip()
return data
from collections import Counter
import os
output_perfix = "output"
os.makedirs(output_perfix)
files = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt']
fileName = files[4]
rows = read_data(fileName).split("\n")
table = {}
for r in rows:
x = r.split()
if x[0] in table:
table[x[0]]["items"].append(x[1])
else:
table[x[0]] = {"items": [],"counter": {}}
table[x[0]]["items"].append(x[1])
for p in table:
table[p]["counter"] = Counter(table[p]["items"])
for p in table:
content = ""
for x in table[p]["counter"]:
if content != "":content += "\n"
content += x + " " + str(table[p]["counter"][x])
f = open(output_perfix + "/" + p + ".txt", "w")
f.write(content)
f.close()
小題2
說明:
定義一個叫做 SalaryDistribution 的 class ,底下定義四個 method:
- min: 回傳
salaries的最小值 - max: 回傳
salaries的最大值 - median: 回傳
salaries的中位數- 中位數:由小排到大之後,長度 $N$ 為奇數時取第 $(N+1)/2$ 個數字,為偶數則取第 $N/2$ 個數字
- mean: 回傳
salaries的算數平均數
成品及時展示:
思路說明
建立class SalaryDistribution,在其中定義__init__、min、max、median、mean這幾個 function 。
class SalaryDistribution:
def __init__(self,salaries):
self.salaries = salaries
self.salaries.sort()
def min(self):
return min(self.salaries)
def max(self):
return max(self.salaries)
def median(self):
if len(self.salaries) == 0:
return self.salaries[0]
if len(self.salaries) % 2:
index = len(self.salaries) // 2
else:
index = len(self.salaries) // 2 - 1
return self.salaries[index]
def mean(self):
total = 0
for n in self.salaries:
total += n
return total / len(self.salaries)
def read_test_data(file_path):
f = open(file_path)
test_data = []
for number in f.read().rstrip().split(' '):
test_data.append(int(number))
return test_data