プログラミング入門II
7月17日の提出状況

Back to index page



  1. 7月17日の提出状況

  2. 前回の宿題について

    大半の人がおおむねできていましたが,下に示すようにせっかく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
    


目次ページに戻る