プログラミング入門II
2024.05.01
リスト その2
変数名は小文字で始めましょう.
print('\nAdd 51 to list: ', end = '') |
不思議なんですが,上のように51を追加するという見本のままのものが結構たくさん見られました.簡単な英語なので,ちゃんと読んで理解してからプログラムを作成しましょう.
print("10 random numbers:", " ".join(map(str, random_numbers))) |
上の例は間違いではありませんが,リストの要素の数値を特に文字列に変換してから表示させる必要はありません.
print(f'Sorted:', end= ' ') -- |
おそらく自分では見えないのでわからないと思いますが,表示させるスペースに全角のものが混じっていました.そのため,私の環境で実行すると,以下のように通常の文字ではない文字が表示されます.
Sorted: @24 24 27 43 58 61 69 72 81 99 - |
for i in range(10): lst.insert(i,random.randint(10,99)) print('10 random numbers: ',end='') for j in range(10): print(f'{lst[j]} ',end='') else: print() lst=sorted(lst) print('Sorted: ',end='') for k in range(0, 10): print(f'{lst[k]} ', end = '') else: print() add=random.randint(10,99) lst.insert(11,add) lst=sorted(lst) print(f'Add {add} to list: ',end='') for l in range(11): print(f'{lst[l]} ',end='') else: print() |
for 文が出てくるたびに新しいインデクス変数を用意する必要はありません.変数の無駄遣いです.
lst = [] print('10 random numbers: ',end='') for i in range(10): lst.insert(i,random.randint(10,99)) print(f'{lst[i]}',end=' ') else: print('\nSorted: ',end='') lst2 = sorted(lst) for i in range(10): print(f'{lst2[i]}',end=' ') else: num2 = random.randint(10,99) print(f'\nAdd {num2} to list: ',end='') lst2.append(num2) lst3 = sorted(lst2) for i in range(11): print(f'{lst3[i]}',end=' ') |
いちいち新しいリストを用意する必要は今回の内容ではありません.
random_numbers=[random.randint(10,99)for _ in range(10)] sorted_numbers=sorted(random_numbers ) print('10 random numbers:',' '.join(map(str,random_numbers))) print('Sorted: ',' '.join(map(str,random_numbers))) new_number=random.randint(10,99) sorted_numbers.append(new_number ) sorted_numbers_with_new=sorted(sorted_numbers) print('add',new_number,'to list: ',' '.join(map(str,sorted_numbers_with_new))) |
処理自体が間違っているわけではありませんが,空行などを入れて全体の見通しを良くしてください.見づらいプログラムになっています.
今回も引き続きリストです.なかなか難しい作業が続きますが,演習問題を通して理解を進めましょう.
これまでリスト要素の逐次表示に反復処理を使用していました.より簡単に出力する方法もありますので,今回はそれを使う方法も確認しておきましょう.教科書 p.202 の Column 7-4 の中に print 関数に与える引数にアスタリスク * をつけてスペース区切りで表示する方法が紹介されています.以下の例で試してみてください.
lst = [1, 2, 3] print(lst) print(*lst) print(*lst[1:]) |
上の最後の行にあるように,スライスを上手に使うと任意の範囲の要素も簡単に表示できます.
教科書では行列を扱う例が紹介されています.リストの中にリストが入っている入れ子の状態です.演習問題では機械学習で使用される畳み込みに関係する例題を行います.
シャローコピーとディープコピーが紹介されています.オブジェクト指向言語では,名前はデータへの参照なので,コピーした先についても参照し続けると,例えば2つのリストを作っても,中身がずっと同じままということになることもありますので,そのような際にはディープコピーが必要となります.
リストを生成するときに,前回の範囲では None を使うか,insert メソッドを使いました.リストは通常複数の要素を持ちますので,生成後に反復処理により値を代入する例を見てきました.今回学習する内包表記はリストの生成時に [ ] の中に for 文を入れて,生成と値の代入を同時に行うものです.演習問題の後半で2次元のリストを扱いますが,その際の内包表記は結構混乱しがちですので,教科書 p.193 の Fig.7-23 の b をよく見て理解していきましょう.
今回はシーケンスについてはとりあえず後回しにします.教科書にも書いてあるように,必要になったらファイル処理のところで,再度学習します.
今回の演習問題です.
宿題はいつものようにレポート提出システムを使用します.今回も18:00以降に閲覧可能となりますので,期限内の提出をよろしくお願いします.
次回も引き続きリストについて学習します.