sk5s 自主學習Time

作業四

說明:

  • 輸入
    每個檔案總共 $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__minmaxmedianmean這幾個 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