プログラミング入門II
2025.05.07
リスト その2

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回はエラーや形式上の不備などが無く,採点していてうれしくなりました.この調子で無駄な原点にならない解答の作成を続けましょう.

    以下は例によって問題のあるプログラムの例です.参考にしてください.

    print('Integurated:',*lst)
    

    綴りも採点の対象です.きちんと確認しておきましょう.

    カタカナ英語での発音で覚えている場合にやりがちなタイプミスです.英語の発音の学習には海外の音楽を聴くのがお奨めです.

    print(f'List with 2-digit number:{lst2}')
    print(f'List with 3-digit number:{lst3}')
    print(f'Integrated:{lst}')
    

    上のようにリストの表示でアンパックを使用しなかった例が数件見られました.表示は当然下のように [ ] にカンマ , が付いた形になるので,おかしいことに気づけたはずなのですが.

    List with 2-digit number:[20, 58, 60, 31, 85, 53, 54, 73, 24, 93]
    List with 3-digit number:[296, 303, 173, 974, 978, 705, 228, 317, 590, 807]
    Integrated:[20, 296, 58, 303, 60, 173, 31, 974, 85, 978, 53, 705, 54, 228, 73, 317, 24, 590, 93, 807]
    

    for i in range(10):
        lst2[i] = random.randint(10, 99)
    
    for j in range(10):
        lst3[j] = random.randint(100, 999)
    
    for k in range(10):
        lst.append(lst2[k])
        lst.append(lst3[k])
    

    for 文のインデックス用の変数は別の for 文になったからといって変更する必要はありません.変数の無駄遣いになります.

    for i in range(20):
        if i%2==0:
            lst[i]=lst2[i//2]
        else:
            lst[i]=lst3[i//2]
    

    今回 if 文は必要ありません.if 文のような条件分岐は処理に時間を食うので,不要な場合は入れないでください.

    for t in range(10):
        num=lst2[t]+lst3[t]
        print(f'{num}',end=' ')
    

    単純にリストの数値の足し算をしているので,結果は当然下にあるように2桁と3桁の数の和になるだけです.

    List with 2-digit number: 39 73 85 46 45 76 51 75 45 33 
    List with 3-digit number: 933 442 743 191 994 214 832 797 342 975 
    Integrated: 972 515 828 237 1039 290 883 872 387 1008 
    

    for i in range(10):
        print(lst2[i], end = ' ')
        print(lst3[i], end = ' ')
    else:
        print()
    

    合成したリストを作成しないで,画面に順に表示するだけでごまかしています.これはダメです.

  3. 前回の復習

    リストの生成,並べ替えなどを学習しました.インデックスを使用して要素にアクセスすることも行いました.要素の操作はスライスでも可能でした.それらの操作においては,便利なメソッドが標準で多数用意されていますので,それらの活用で処理を簡単に書くことができるのがPythonの利点です.今後も活用していきましょう.

  4. リスト

    今回も引き続きリストです.なかなか難しい作業が続きますが,演習問題を通して理解を進めましょう.

    1. リスト要素の表示方法
    2. 前回の演習問題でも要素の一覧を簡単に出力する方法であるアンパックを使用しました.今回もそれを使う方法も確認しておきましょう.教科書 p.202 の Column 7-4 の中に print 関数に与える引数にアスタリスク * をつけてスペース区切りで表示する方法が紹介されています.以下の例で試してみてください.

      lst = [1, 2, 3]
      print(lst)
      print(*lst)
      print(*lst[1:])
      

      上の最後の行にあるように,スライスを上手に使うと任意の範囲の要素も簡単に表示できます.

    3. 2次元リスト

      教科書では行列を扱う例が紹介されています.リストの中にリストが入っている入れ子の状態です.演習問題では機械学習で使用される畳み込みに関係する例題を行います.

    4. コピー

      シャローコピーとディープコピーが紹介されています.オブジェクト指向言語では,名前はデータへの参照なので,コピーした先についても参照し続けると,例えば2つのリストを作っても,中身がずっと同じままということになることもありますので,そのような際にはディープコピーが必要となります.

    5. 内包表記

      リストを生成するときに,前回の範囲では None を使うか,insert メソッドを使いました.リストは通常複数の要素を持ちますので,生成後に反復処理により値を代入する例を見てきました.今回学習する内包表記はリストの生成時に [ ] の中に for 文を入れて,生成と値の代入を同時に行うものです.演習問題の後半で2次元のリストを扱いますが,その際の内包表記は結構混乱しがちですので,教科書 p.193 の Fig.7-23 の b および p.195 の Fig.7-25 の b をよく見て理解していきましょう.

      2次元の空のリストを作るときに以下のような間違いをしがちなので,注意してください.

      none_lst = [[None] * 5] * 5
      print(none_lst)
      

      実行すると確かに以下のように2次元で5×5のNoneのリストはできます.

      [[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]

      ただし,後から値を代入すると変なことになります.

      none_lst = [[None] * 5] * 5
      
      for i in range(5):
          for j in range(5):
              none_lst[i][j] = i + j
      
      print(none_lst)
      

      [[4, 5, 6, 7, 8], [4, 5, 6, 7, 8], [4, 5, 6, 7, 8], [4, 5, 6, 7, 8], [4, 5, 6, 7, 8]]

    6. フラットシーケンス

      今回はシーケンスについてはとりあえず後回しにします.教科書にも書いてあるように,必要になったらファイル処理のところで,再度学習します.

  5. 演習

    今回の演習問題です.

  6. 宿題

    宿題はいつものようにMoodleを使用します.今回も18:00以降に閲覧可能となりますので,期限内の提出をよろしくお願いします.

  7. 次回の予習範囲

    次回も引き続きリストについて学習します.


目次ページに戻る