1 準備
- TechFUL にログインしておいてください。
- GoogleColab.
にログインしておいてください。
- 「0615_リスト(配列)_XXXX.ipynb」という名前でノートブックを作成しておいてください。今回はノートブックの提出があります。末尾の
XXXXには 「高専太郎」のように氏名を記載 してください。
- 「0615_リスト(配列)_XXXX.ipynb」という名前でノートブックを作成しておいてください。今回はノートブックの提出があります。末尾の
1.1 補足
他高専の情報系学科のプログラミング教育の動向も把握しておきましょう。特に2年生前期で、どのようなプログラミング学習をしているのか確認してみてください。
皆さんは、3年次の前期に学修単位の「プログラミング2」で C言語 を学習予定です。また、3年次の後期に学修単位の「プログラミング3」で ウェブ系言語 (フロントとバックの両方) 学修予定です。また「データ構造とアルゴリズム1」と「データ構造とアルゴリズム2」でも C言語 を扱います。
2 演習⑥
この演習⑥は、今回の講義内容を把握したうえで 最後に取り組んでもらう演習 です。以下、この演習に取り組むために必要な要素 (リスト関連の処理) を扱っていきます。それらを効果的に学ぶためにも、はじめに演習⑥の内容を把握しておいてください。
FC版DQ3 (ファミコン版のドラゴンクエスト3)
の武器を扱った「100連ガチャ」のシミュレータを作成したい。ガチャにより排出される武器は
item_names_str
でカンマ区切りで与えられる全33種の武器である。また、その排出比は
item_p_str
でカンマ区切りで与えた数値となっている。
ここでの排出比とは・・・例えば「ひのきのぼう」「こんぼう」「どうのつるぎ」の全3種を仮定し、その排出比が「\(10\)」「\(5\)」「\(2\)」であれば、「ひのきのぼう」があたる確率は \(10/(10+5+2)\)、「こんぼう」があたる確率は \(5/(10+5+2)\)、「どうのつるぎ」があたる確率は \(2/(10+5+2)\) のように考えること。
%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,2,1'上記の設定に基づき100連ガチャのシミュレーションを実行し、次のような出力を得たい。
100連ガチャの結果、以下のアイテムを獲得しました。
ひのきのぼう ... 8個
こんぼう ... 8個
どうのつるぎ ... 9個
せいなるナイフ ... 8個
くさりがま ... 11個
とげのむち ... 7個
まどうしのつえ ... 5個
てつのやり ... 7個
どくばり ... 6個
てつのつめ ... 5個
はがねのつるぎ ... 4個
てつのオノ ... 3個
あまぐものつえ ... 2個
いかづちのつえ ... 1個
さざなみのつえ ... 6個
さばきのつえ ... 2個
ゆうわくのけん ... 3個
りりょくのつえ ... 2個
おおかなづち ... 1個
ゾンビキラー ... 1個
まじんのオノ ... 1個
この要求を満たすことができるPythonプログラムを考え、実装せよ。
2.1 Bing Image Creator
次の画像は Bing Image Creator で生成したものです。マイクロソフトアカウントがあれば無料で利用ができます。皆さんも活用してみてください。
3 効率的な開発
3.1 適切なエディタと実行環境の選択
GoogleColab.に比較して、TechFULのエディタは極めて貧弱です (Colab.が強力すぎるとも言えますが)。
例えば、文法ミスのチェック や 入力補完 など、初心者ほど必要になってくる機能について Colab. のほうが充実しています。そのため、原則として Colab. で基本的なコーティングとデバッグを進め、その後、TechFUL にコピペして検証する (テストケースをパスするか確認する) という取組みスタイルをとってください。
今後、TechFUL のエディタ上でコーティングやデバッグを進めている学生からの質問・相談には対応しません。
3.2 開発時には標準入力関数 input を使用しない
TechFUL では、そのシステムの機能上、標準入力関数
input()
を使用することになりますが、入力に関するコーティングやデバッグ、テストをするとき以外は、開発効率が著しく悪化するので使用しないでください。
例えば、TechFULで次のような標準入力を受け取る問題があるとします。
15.5
20.2
これを受け取ってプログラム内で処理するためには、input()
を使って次のようにコードを書きますが
上記のようなコードのまま開発を進めると、プログラムの実行毎に
15.5 と 20.2
を打ち込む必要があり、極めて効率が悪いです。そのため、開発段階では以下のようにしておきます。
%reset -f
# str1 = input()
# str2 = input()
str1 = 10.5
str2 = 20.2
x1 = float(str1)
y1 = float(str2)
# 以下、x1 と y1 を使った処理このようにすることで、実行毎に数値を入力する手間が無くなります。
また、TechFUL で検証するときは
(テストケースをパスするか確認するときは)、次のようにコメント化する位置を差し替えます。なお、Colab.
でコメントアウト・アンコメントは Ctrl+/
のショートカットキーを利用します。
%reset -f
str1 = input()
str2 = input()
# str1 = 10.5
# str2 = 20.2
x1 = float(str1)
y1 = float(str2)
# 以下、x1 と y1 を使った処理4 確認:print関数の引数
以前に紹介済みですが、今回の演習で利用する可能性があるため、print
関数に 複数の引数
を与えた場合の動作と、sep
引数を与えた場合の動作について改めて確認しておきます。いまさらですが「引数」の読み方は
「ひきすう」 です
(「いんすう」ではないので注意してください ) 。
print 関数には 2個以上の引数
を与えることが可能で、その場合、次のように半角スペース1文字で区切られた出力を得ることができます。
上記プログラムの実行結果は次のようになります。
AAA BBB CCC DDD
半角スペース1文字で区切られた出力となっていることを確認してください。
また、最後の引数に sep= を与えると( 半角スペースではなく)
任意の区切り文字を使用することができました。sep
は「Separator (セパレータ)」の略になります。
次のプログラムを実行して結果を確認してください。
なお、print(a, b, c, sep='-', end='' ) における
sep= や end= のような引数を
キーワード引数 や
名前付き引数
といいます。これらの引数は、通常の引数 (これらを 位置引数 といいます)
のあとに与える必要があります。
キーワード引数 を 位置引数 よりも前に記述するとどうなるか実際に確認してください。
5 Pythonにおける「リスト」とは
C言語における配列 (Array: アレイ) に相当する機能を、 Python では リスト (List: リスト)と言います。
例えば、次の array.c
のようなC言語プログラムと、同じ出力を得る Pythonプログラムは
list.py のように書くことができます。2つの言語における
記号の違いなど に注意して比較してください。
#include <stdio.h>
#define N 4
#define M 20 // 1アイテム(英数字であれば)最大20文字まで
int main(void){
char items[N][M]={"どうのつるぎ","やくそう","どくけしそう","ぬののふく"};
for(int i=0;i<N;i++){
printf("%s\n",items[i]);
}
}いずれのプログラムも実行結果は次のようになります。
どうのつるぎ
やくそう
どくけしそう
ぬののふく
「Pythonのリスト」は「C言語の配列」よりも非常に柔軟で強力な機能を提供してくれます(C++言語におけるVectorに近い機能を提供してくれます)。その結果、C言語の配列では「できないこと」「極めて面倒なこと」を、Pythonのリストでは比較的簡単に行なうこと (短いコードで記述すること) ができます。
ここからリストの使い方や、リストが持つ機能について詳しく学んでいきます。
6 リスト初期化と要素の参照
リストでは、list.py
の例のように文字列のほか、数値 や
各種オブジェクト を格納することができます
(「オブジェクト」については、この先で学んでいくので現時点では気にしないでください)。
リストの初期化 (リテラルを使った初期値の設定)
は次のように記述します。リストを構成する「要素」の参照
(=読み取り) は C言語と同じように [] の
角括弧 / 大括弧
を使用します。
%reset -f
a = [10,20,30,40] # 初期化(数値)
b = a[0] * a[1] # a[0]で0番目の要素(=10)、a[1]で1番目の要素(=20)を参照
print(f'b = {b}') # b = 200%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく'] # 初期化(文字列)
item_prices = [100,8,10,10] # 初期化(数値)
i=1
print(f'{item_names[i]}は{item_prices[i]}Gで売られている。')角括弧のなかに与える数値を
インデックス や
添え字 と言います。インデックス
(添え字)は ゼロオリジン になります(
リストの先頭は 0 となる点に注意してください )。
注意: 変数に「list」という名前を付けないこと
Pythonにおいて list は、if や
for と同様に
変数名などに使用してはいけない予約語
になっています。list
という変数を作成しても、即座にエラーになるわけではありませんが、以降のプログラムのどこかで問題を引き起こす可能性があります。
6.1 演習①
上記の dq3-items.py
プログラムの第04行目以降を修正して、実行結果として次のような文字列が得られるようにせよ。なお、売価は価格の3/4で設定されているものとする
(小数以下は切り捨て) 。
「どうのつるぎ」は、100G で購入し、75G で売却できる。
「やくそう」は、8G で購入し、6G で売却できる。
「どくけしそう」は、10G で購入し、7G で売却できる。
「ぬののふく」は、10G で購入し、7G で売却できる。
ヒント
for文を利用してください。- 「小数以下は切り捨て」とは「7.2」を「7」、「7.9」も「7」にするような処理を指します。
- f文字列の書式指定子は、小数の「切り捨て」には対応していません。数値の切り捨て処理の方法は「Python 数値 切り捨て」などで検索してください。
6.2 文字列を使ったリストの初期化
実用的なプログラムでは、リストを構成する要素が 1つの文字列として与えられること (あるいはテキストファイルから入力されること) があります。
例えば、次のように「カンマ区切りの文字列」でリストとして扱いたい情報が与えられることがあります。
このようなとき、手作業で
['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
のように書き換えるべきではありません。
次のように、文字列の split メソッドを利用して
任意文字で文字列を分解してリスト化
することができます。
%reset -f
item_names_str='どうのつるぎ,やくそう,どくけしそう,ぬののふく' # 文字列
# item_names_str -> item_names
item_names = item_names_str.split(',') # ★文字列をカンマで分解してリスト化
for i in range(len(item_names)):
print(item_names[i])また、分解した文字列をさらに 数値に変換したい という場合もあります。
このような場合は、次のように組み込み関数の map と
float を利用します。
%reset -f
item_p_str='0.65 0.30 0.05' # スペース(SP)区切りの文字列
item_p1 = item_p_str.split(' ') # 文字列をSPで分解してリスト化
# 現状で item_p1 の要素は【文字列】 ※計算処理に利用できない
for i in range(len(item_p1)):
print(item_p1[i]*100)
print('---')
# item_p1 の要素を【数値】に変換
item_p2 = list(map(float,item_p1)) # ★ここがポイント!
for i in range(len(item_p2)):
print(item_p2[i]*100)このプログラムで使われている map
については、以降の授業で
詳しく解説します。現状では第12行目のように処理を書くことで「リストの要素を文字列から数値
(実数値 float) に変換できる」と知っておいてください。
なお、要素を文字列から整数値 (int)
に変換したい場合は、map の第1引数に
int を与えてください。
6.3 演習②
次のようにカンマ区切りで「アイテム名称」と、そのアイテムに関する「数値
(パラメータ)」が与えられている。item_names_str から
item_names というリスト
(要素は文字列)
を作成せよ。また、item_p_str から item_p
というリスト (要素は数値) を作成せよ。
%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,1,1'
item_names = 0 # 書き換える
item_p = 0 # 書き換える(複数行でも可)
print(item_names)
print(item_p)正しく処理ができれば、実行結果として次のような値を得るはずです。
['ひのきのぼう', 'こんぼう', 'どうのつるぎ', …略…, 'おうじゃのけん']
[50, 50, 50, …略…, 1]
なお、item_p の出力が
['50', '50', '50', …略…, '1'] # リストの要素が【文字列】
[50., 50.0, 50.0, …略…, 1.0] # リストの要素が【実数値】
のようになっている場合、要素を正しく「整数値」に変換できていません。
7 リストのインデックス範囲
リストは ゼロオリジン であり、角括弧内には 整数値でインデックスを与える必要 があります。
上記のプログラムの第03行目を書き換えて、
- リストに対して「範囲外のインデックス」を与えた場合、どのようになるか確認せよ
(エラーとなる場合は、何というエラーになるか? まで確認すること)
。例えば、要素数を超えた
item_names[9]を指定した場合など。 - リストに対して「小数値のインデックス」を与えた場合、どのようになるか確認せよ。
item_names[0.5]item_names[1.00]
- リストに対して「負数のインデックス」を与えた場合、どのようになるか確認せよ。
item_names[-1]item_names[-2]
8 リストの要素数
リストが内部に「いくつの要素を持っているか」は、次のように
組み込み関数の len
を使って取得することができます。len は Length (長さ・レングス)
の意味を意味します。
次のプログラムを実行して結果を確認してください。
%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(f'現在、{len(item_names)}個のアイテムを所持しています。')これを利用すれば、for
は次のようにスマートに記述することができます。
%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(item_names)): # ★rangeの引数に注目
print(item_names[i])len(item_names)
は整数値を返すので、range
以外にも、次のように計算式などに利用することができます。実際に実行して結果を確認してみてください。
%reset -f
max_item_num = 99
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
x = max_item_num - len(items) # ★lenを計算式に組み込む
print(f'あと {x}個 のアイテムを持つことができます。')8.1 リストの初期化2
[0,0,0,0,0] や ['乙','乙','乙']
のように全て同じ値を持ったリストは、次のように初期化できます。
8.2 演習③
item_names と同じ長さ (=同じ要素数)
で、その要素がすべて 0(整数値) となるリスト
item_counts を作成せよ。
%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_names = item_names_str.split(',')
item_counts = 0 # ここを書き換える。33という数値の直接記述は禁止。lenを利用すること。
print(f'item_namesの長さ = {len(item_names)}')
print(f'item_countsの長さ= {len(item_counts)}')
print(item_counts)9 リストと組み合わせ可能な組み込み関数
len のほかにも、様々な 組み込み関数
とリストを組み合わせることができます。
%reset -f
a = [60,20,40,-30,90]
print(f'sum(a)= {sum(a)}')
print(f'max(a)= {max(a)}')
print(f'min(a)= {min(a)}')上記のプログラムについて、リストの要素が文字列であった場合にどのようになるか確認せよ。例えば
a=['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
である場合など。
sum、max、min 以外の 組み込み関数
もリストを引数にとることができます。
10 リストとprint関数
print関数の引数に、直接、リストを与えることができます。次のプログラムを実行して、どのような結果が得られるかを確認してください。
中級者向け: リストのアンパック
リストを関数の引数として与える場合、先頭にアスタリスクをつけて アンパック (展開) という処理を施すことができます。これにより、次のようなことができます。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(*items, sep='\n') # itemsの頭に「*」を付けた。また sep 引数を設定このとき、第03行目のは次のような文と同じ意味を持ちます。
つまり、リストをアンパックすると「リスト内の要素を個別の引数として関数に与えること」が可能になります。
11 リストにおける要素の書き換えと追加
リストに含まれる要素は、次のようにインデックスで指定して書き換えることができます。実際に実行して確認してみてください。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items[0] = 'はがねのつるぎ'
items[2] = 'まんげつそう' # マヒの回復
for i in range(len(items)):
print(items[i])また、(要素の変更だけではなく)
要素の追加も可能で、それにはリストの
append メソッドを使用します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.append('かわのたて') # 末尾に追加
for i in range(len(items)):
print(items[i])
print(f'※ 現在、所持しているアイテムは以上の {len(items)}個 です。')このように リストの要素数が変化する状況では
len(items)
は非常に便利です。リストの要素数は、変数を使って保持するのではなく、常に
len を使って参照するようにしてください。
また、リストの末尾以外に要素を追加したい場合は、リストの
intsert メソッドを使用します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.insert(0,'かわのたて') # items[0]に「かわのたて」を挿入
for i in range(len(items)):
print(items[i])無論、要素を削除するメソッドも存在します (検索すればすぐに見つけることができます)。
メソッドとは何か
オブジェクトが所有する関数を メソッド
といいます。「オブジェクトとはなにか」は、まだ扱っていませんが、リストはオブジェクトです。そして、メソッドとは
オブジェクトが持っている関数
を指します。オブジェクトが持っているメソッドは
.(ドット) を使ってアクセスすることができます。
GoogleColabでは、プログラムを記述する際、メソッドの
入力補完 が受けられます。例えば、Google
Colab.に次のプログラムを貼り付け、それに続けて03行目に
items.
まで入力してみてください。2秒ほどするとメソッドの一覧が表示されると思います。
表示された候補は、上下キーで選択して、Tabキーで決定します。
11.1 要素を持たない空のリスト
プログラムの実行中に append や insert
を使って、逐次、要素を追加していく場合、最初は要素を持たないリストで初期化したい場合
があります。これは、次のように記述できます。
%reset -f
items = [] # 要素を持たない空のリスト
items.append('どうのつるぎ')
items.append('たびびとのふく')
for i in range(len(items)):
print(items[i])また、第02行目は items = list()
のように記述することもできます。
11.2 演習④
次のプログラムの04行目以降を書き換えて、期待する出力が得られるようにせよ。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
# ここから下を書き換える (リストに要素を追加する処理を追加する)
for i in range(len(items)):
print(items[i])期待する出力 (アイテムの並び順も同じにすること)
ひかりのたて
おうじゃのつるぎ
どうのつるぎ
やくそう
てっかめん
どくけしそう
ぬののふく
なお、ここでは、04行目に
items=['ひかりのたて','おうじゃのつるぎ','どうのつるぎ','やくそう','てっかめん','どくけしそう','ぬののふく']
のような記述をすることは意図していない。append や
insert を利用して演習に取り組むこと。
12 要素の検索
リストのなかに 指定の要素が存在するか
を調べたい場合には in を使った if文を構成します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items : # in を使った条件分岐
print(f'勇者ヨシヒコは {target} を使用した')
else :
print(f'勇者ヨシヒコは {target} を持っていない')上記の第03行目を target = 'キメラのつばさ'
に変更して動作を確認してください。
12.1 要素が含まれないことを判定するには
items というリストのなかに target
という要素が存在するとき target in items
は「真」となります。では、存在しないとき
に「真」となる条件式はどのように書けるのか、自分自身で調べてみてください
(ChatGPTなどを利用する方法もあります)。
12.2 当該要素のインデックスの検索
指定の要素が「リストの何番目に存在するか」を調べたい場合は、リストの
index メソッドを使用します。なお、変数名の
idx は、indexの略表記です。
次のプログラムを実行して、その結果を確認してください
(単に実行するだけではなく target
を書き換えて、それに応じて動作がどのように変化するか、予測して、確認してください。)
。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items :
idx = items.index(target) # ★ 要素を検索して、発見したインデックスを返す
print(f'勇者ヨシヒコの {idx}番目 のポケットに {target} が入っている')
else :
print(f'勇者ヨシヒコは {target} を持っていない')以下のプログラムを利用し、次のパターンにおいて変数
idx にどのような値が格納されるか
(あるいは実行時エラーが生じるのか) を確認せよ。
itemsに存在しないものをtargetに指定した場合itemsのなかにtargetと同じ要素が2個以上存在する場合
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
idx = items.index(target)
print(f'idx={idx}')12.3 演習⑤
いま、所持しているアイテムの名前を item_names
というリストで管理し、また、その所持数を item_counts
というリストで管理している。
つまり、下記プログラムの第02行目と第03行目によって「やくそう」を4個、「どくけしそう」を2個、「まんげつそう」を0個、「せかいじゅのは」を1個所持している状態を管理・表現している。
宝箱を開けたときの入手アイテム target
により、それらが適切に更新されるようにプログラムを書き換えよ。
- はじめに、
targetが「やくそう」「どくけしそう」「まんげつそう」「せかいじゅのは」のいずれかであるパターンに対応させること。 - つづいて、
targetに「きえさりそう」などの 未所持アイテムが与えられるパターン にも対応させること。 - おまけ:DQ3では「せかいじゅのは」は最大で1個までしか所持できない制約がある。これを反映させること。
%reset -f
item_names = ['やくそう','どくけしそう','まんげつそう','せかいじゅのは']
item_counts = [4,2,0,1] # アイテムの所持数
target = 'やくそう'
print('勇者ヨシヒコは宝箱を開けた、',end='')
print(f'なんと「{target}」を手に入れた。')
# ここに target に応じて item_counts などを更新する処理を記載
print('\n---所持品の確認---')
for i in range(len(item_names)):
print(f'{item_names[i]}...{item_counts[i]}個')13 Pythonicなリストとfor文の組み合わせ
ここまでは、C言語のスタイルに寄せてリストとfor文を組み合わせる方法を紹介してきました。一方で、Pythonicに (Pythonらしいスタイルで) リストの要素を列挙する場合、次のようにコードを記述します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)): # ★この行に注目
print(items[i])いずれも実行結果は次のようになります。py-style1.py
では、itemsの要素数だけループが繰り返され
(つまり、このケースでは要素数が4個なので、4回のループとなり)、変数
t には1回目のループでは 'どうのつるぎ'
が格納され、2回目のループでは 'やくそう'
が格納され・・・という動作になります。
どうのつるぎ
やくそう
どくけしそう
ぬののふく
また、forブロックのなかで
インデックス番号を参照したい場合 は、次のように
enumerate を使って記述します。
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i,t in enumerate(items): # ★この行に注目
print(f'{i+1}. {t}')%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)):
print(f'{i+1}. {items[i]}')いずれも実行結果は次のようになります。
1. どうのつるぎ
2. やくそう
3. どくけしそう
4. ぬののふく
py-style2.py では、変数 i
にはゼロオリジンのインデックス番号、変数
c には要素が格納されます。
14 ランダム処理とリストの組み合わせ
第02回の講義で既に登場していますが、randomモジュールの
choice
関数とリストを組み合わせることで「リストのなかからランダムに要素を取得する処理」を簡単に書くことができます。
%reset -f
import random as r
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
c = r.choice(items)
print(f'勇者ヨシヒコはパルプンテを唱えた。なんと「{c}」が粉々に砕け散った。')また choice 関数ではなく、choices
関数を使用すると均等確率による要素のランダム取得ではなく、重み付きの確率による要素のランダム取得ができます。次のプログラムを実行して確認してみてください。
%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p)
print(c) # choicesの戻値はリストになるので
print(c[0]) # [0]で先頭要素を取得するchoices 関数に k=
のキーワード引数を設定すると、一度に \(k\)
個の要素を取得することができます。
%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p,k=10) # ★k=10を設定
print(c)上記のプログラムを実行すると変数 c
には、次のように \(10\)
個の要素を持ったリストが格納されます。
['R', 'SSR', 'R', 'R', 'R', 'SR', 'LR', 'R', 'SR', 'SR']
15 課題 (宿題)
「演習①」から「演習⑥」について、今回の講義で作成したノートブックのなかで取組み、そのリンクを Google Classroom に記載したフォーム経由で提出してください。
- 標準 (=指示した最低限のことができている)
を7.5点として、10点満点で評価します。
- 0点~7.5点の範囲は絶対評価で点数をつけます。
- 7.5点~10点の範囲は相対評価で点数をつけます。
- テキストセルを使って演習番号 (例えば「演習⑤」「演習⑥」など) を明記してください。
- 提出物 (納品物) として「品質
(クオリティ)」を強く意識して作成してください。これらの提出物は、今後、就職やインターンシップ等の応募/選考に皆さん自身が活用する
ポートフォリオ (自身のスキルを示す作品集)
の素材ともなります。
- 高専在学中の学習成果物として採用担当者に見せられないようなプログラム (やっつけ仕事の適当なプログラム) を作成しないでください。
- 演習毎にコードセル先頭に
%reset -fを含めてください。