プログラミング入門II
7月17日の提出状況
大半の人がおおむねできていましたが,下に示すようにせっかく1個のリストとして読み込んだCSVデータを複数のリストに分ける作業をする人が多かったのが残念です.多次元のリストをそのまま活用することも考えてください. なお,今回は私の作成したソースの実行例でスペルの間違いがありました.(誤: aveage,正: average)すみませんでした.ちゃんと気づいた人が直していたので,感心しました. 実行時エラー: b2318 解答用紙の氏名間違い: b2321 b2359 解答用紙の番号間違い: b2359 出力時番号間違い: b2359 以下は例によって問題のあるプログラムの例です.参考にしてください.
print('The highest tempertures in August, 2023')
今回も少ないながら上のような綴りの間違いはありました.
mean = [float(temp_txt[i][1])for n in range(1,32)] |
上のものは実行時にエラーになっています.メッセージも出ているので,そこは直してから出してほしいところです.リスト temp_txt のインデックスとして変数 i を使用していますが,後半の内包表記では変数が n になっています.
print(f'Average {mean_temp_date:>6} {mean_temp:>9}') print(f'Highest {high_temp_date:>6} {high_temp:>9}') print(f' Lowest {low_temp_date:>6} {low_temp:>9}') |
print 文の中で値の桁数の指定はしているのですが,小数点以下の桁数を指定していませんので,37.0 は下のように整数で表示されてしまいます.
Average 10 32.4 Highest 5 37 Lowest 10 30.4 |
a=[None]*31 b=[None]*3 c=[None]*3 lst_txt[0][1]='Average' lst=[[float(lst_txt[i][j]) for j in range(4)] for i in range(1, 32)] for i in range(3): for j in range(31): a[j]=lst[j][i+1] b[i]=max(a) c[i]=a.index(b[i]) + 1 |
変数名(リスト名)が a などの意味のない1文字であることもよくありませんが,2次元の元々のリストを1次元に置き換える作業が無駄です.
for j in range(1,4): n = 0 print(f'{name[j-1]} ',end = '') for i in range(1,31): if n < temp[i][j]: deta = i + 1 n = temp[i][j] print(f'{deta:2}', end = ' ') print(n) |
動作は間違っていませんが,Python は便利な関数が用意されているので,それらを使用することを本来は優先してほしいところです.
print(f'Average {average_lst.index(max(average_lst)):2} {max(average_lst)}') print(f'Highest {highest_lst.index(max(highest_lst)):2} {max(highest_lst)}') print(f' Lowest {lowest_lst.index(max(lowest_lst)):2} {max(lowest_lst)}') |
せっかく index メソッドを使用しているのですが,リストのインデックスと日付は値が同じではないので,下のように日付がずれてしまいます.
Date Temperature [˚C] Average 9 32.4 Highest 4 37.0 Lowest 9 30.4 |
for i in range(3): print(f'{name[i]} {dataset[i]. index(max(dataset[i]))+1:6} {max(dataset[i]):9}') |
最初に表示する文字列の文字数を指定してないので,下のように数値の表示がずれます.
Average 10 32.4 Highest 5 37.0 Lowest 10 30.4 |
with open ('temp_matsue_2024_08.csv', 'r') as f: d = reader(f) next(d) data = [row for row in d] dates = [row[0] for row in data] average_temps = [float(row[1]) for row in data] highest_temps = [float(row[2]) for row in data] lowest_temps = [float(row[3]) for row in data] highest_average = max(average_temps) highest_max = max(highest_temps) highest_min = max(lowest_temps) index_average = average_temps.index(highest_average) index_max = highest_temps.index(highest_max) index_min = lowest_temps.index(highest_min) date_average = dates[index_average] date_max = dates[index_max] date_min = dates[index_min] print('The highest tempretures in August, 2023') print() print(' Date Temperature [℃]') print(f'Average {date_average} {highest_average}') print(f'Highest {date_max} {highest_max}') print(f' Lowest {date_min} {highest_min}') f.close() |
読み込みや書き込みなどの処理以外も全部 with 文に入れてしまうのは感心しません.
from csv import * print('Student number: s******') print('') filename = '/documents/temp_matsue_2024_08.csv' # CSVファイルを読み込み、データをリストに格納する with open(filename, mode='r', encoding='utf-8') as file: csv_reader = csv.reader(file) header = next(csv_reader) # ヘッダー行をスキップ data = list(csv_reader) |
読み込むファイル名を指定していましたが,別のディレクトリに置くことは想定していませんでした.まず,そこでエラーが出ます.次に,import 文でモジュール名なしで reader を使えるのに,モジュール名をつけているので,そこでもエラーが出ます.それと,ファイルの close がありませんでした.
mean = [float(temp_txt[i][1]) for i in range(1,32)] high = [float(temp_txt[i][1]) for i in range(1,32)] low = [float(temp_txt[i][1]) for i in range(1,32)] |
平均値,最高値,最小値のそれぞれで同じインデックスで temp_txt の要素を読み込んでいるので,当然,下のように同じ値が入ってしまいます.
Aveage 10 32.4 Highes 10 32.4 Lowest 10 32.4 |