情報処理概論

九州大学 工学部地球環境工学科 講義資料 担当：木村

05 リスト（配列・多次元配列）

多数のデータ処理(要求)

10,000人分の成績データをもらって，合計点の大きい順に並べ替えて出力したい．

(方法)

ひとまず，全部のデータを変数に入れておく．

(問題)

しかし，d1,d2,d3,..,d10000;のように，10,000個も変数を書けるか?

(解決策) 「リスト」を使おう!!
C言語では「配列」

Pythonの「リスト」は、配列よりも、ずっと高機能リスト型変数
リスト ”list”
例： list1 = []何も入ってない袋
例：

例：

list2 = [1,2,3,5,8]
list3 = [“dog”, “cat”, “fish”]
好きな数字や文字列を好きなだけ入れられる

ただし可能な処理は限られる

list4= [“A”, 2]#複数の型が混在してもOK
list5 = [ [1,2,3], [2,5], ,,.] #入れ子にも出来る
後で「行列」として説明リスト型のイメージ
list =[2, 4, 6, 8, 10, 12, 14]7個の箱が並ぶと考える．
先頭から順番に 0，1，2，… と添字が付く．
01212

list

←0からカウント！

list[1] = 4143

リスト型の演算••例：＋：リストの連結＊：繰り返し実行結果：

例：• リストの一部取り出し

実行結果：#最初の要素を取り出す#０番目から(2-1)番目を取り出しリストとして返す（スライス）#リストの最後の要素を取り出す

リストによる行列の表現
 行列をリストの組（リスト）で表現する

 行列

各行をリストとみなす

入れ子＝リストを要素としたリスト

例：

X=[[1,2,3], [4,5,6],[7,8,9]]
X[0]=[1,2,3], X[1]=[4,5,6], X[2]=[7,8,9] (i 行目)
X[0][0]=1, X[1][2]=6, X[2][1]=8 (i 行ｊ列目の要素)

リストの要素の追加・削除• appendメソッド: 末尾に要素を追加する

例：
実行結果：

• 特定の位置の要素を変更・削除もできる

例：#4番目の要素を6に変更#始め2つの要素を削除

実行結果：• リストの指定した位置へ要素を挿入 例： mylist = ["Blue", "Red", "Green"]
mylist.insert(2, "White")#”White”をインデックス2の前に挿入
mylist.insert(0, "Black")#”Black”をprint(mylist)
インデックス0の前に挿入
実行結果： [“Black”,”Blue”,”Red”,”White”,”Green”]

リストのメソッド・関数（１）・countメソッド
・len 関数例） num = abc_list.count(x) # リストabc_list中の要素xの出現回数を返す

例） num = len( mylist ) # リストmylist中の要素の個数を返す

・min 関数 例） num = min( list_1 ) # リストlist_1中の最小の要素を返す
・max 関数 例） num = max( list_2 ) # リストlist_2中の最大の要素を返す
・sum 関数 例） num = sum( list_3 ) # リストlist_2中の要素の和を返す
・sort メソッド 例） list_test.sort()# リスト list_test を要素の小さい順にソートする

元のリストはそのまま

・sorted 関数 例） list_4 = sorted( list_test ) # リスト list_test をソートした新しいリストlist_4を作る
sorted( リスト名, key=関数名 ) # リスト中の要素を関数名で表された関数の値の小さい順にソート例） list_test=[5,-4,-7,6]
実行結果  [-7,-4,5,6]
print( sorted(list_test) )print( sorted(list_test, key=abs) ) 実行結果  [-4,5,6,-7]リストのメソッド・関数（２） Randomモジュールの利用： import random とすること
・random.choiceメソッド リスト中の要素をランダムに１つ選んで返す例）
import random
abc_list = [ 2,3,5,7,11,13,17]
x = random.choice( abc_list ) # リストabc_list中の要素をランダムに１つ選んでxへ代入
・random.shuffle メソッド リスト中の要素をランダムに並び替える例）
import random()
List_test = [1,2,3,4,5,6,7,8]
random.shuffle(List_test)
print( List_test )実行結果： [4,5,2,1,3,8,6,7]
・random.sampleメソッド リスト中の要素をランダムに非復元抽出した新しいリストを生成する例）
import random()
元のリストはそのまま
List_test = [1,2,3,4,5,6,7,8]
重複なし
List_2 = random..sample(List_test,3)
実行結果： [5,3,8][1,2,3,4,5,6,7,8]
print( List_2,List_test )文字列からのリストの生成
splitメソッド:• str.split() : 文字列strを空白（複数まとめて）に基いて分割し，部分文字列のリストを返す•str.split(sep=区入り文字列) : 文字列strを区切り文字列に基いて分割し，部分文字列のリストを返す

詳細： https://docs.python.org/ja/3/library/stdtypes.html

9リストの条件文・ x in list_1

例：

リストlist_1に要素xが含まれればtrue, さもなければFalse

mylist = [2,3,4,5,6,8,10,11,12]
X=1
if( X in mylist ):print( “mylist中に”, X, ”が要素として含まれます”)
else:
print( “mylist中に”, X, ”が要素として含まれません”)

・ for 変数 in list_2

for 文において，rangeの代わりにリストを用いることができる

例：
実行結果：
10

for文を用いたリストの生成：リスト内包表記
例： x=[1,2,3,…,10]を生成する#空リストを生成

例１：
普通のforループ

例２：
リスト内包表記#i=1,…,10 について繰り返し#リスト x の末尾に i を追加

リスト内包表記と if 文
リスト内包表記に if 文を用いることもできる：•for 変数 in (リスト，range等) if (条件文)• 例： i = 1,…,10 のうち、奇数であるものを要素としたリストを生成

【例】 メジアン（中央値）の計算プログラム
print("メジアンを計算します。カンマで区切って数字を入力してください")
moji=input() #----キーボードから文字列を入力
moji_list=moji.split(sep=",") #----文字列mojiをカンマで分割してリストmoji_jist生成
num_list=[] #-----数字のリストを用意 最初は空for index in range( len(moji_list) ):要素が文字列のリスmoji_listトから、要素を１つづつ取り
num_list.append( float( moji_list[index] ))出して数字に変換し、新しいリストnum_listへ加えていく
print("入力された数字のリスト",num_list)
num_list.sort() #------リストをソート
print("ソート結果",num_list)
リストから要素を取り出す場合に指示する
median=0.0 #-----計算すべき変数を用意
インデックスの数字はint型 それ以外はエラー
if len( num_list )%2==0 :
要素数を２で割ったりするとfloat型になるので#-----数字のリストnum_listの要素数が偶数Int型に変換する
med_index=int( (len(num_list)/2) -1 )median=(num_list[med_index]+num_list[med_index+1])/2
else:#-----数字のリストnum_listの要素数が奇数
med_index=int( (len(num_list)-1)/2 )median=num_list[med_index]
print("メジアン＝",median)課題：統計量の計算プログラム
１） 標準入力から何個かの数値をカンマ区切りで入力 （例:1,6,4），２） split メソッド を用いて入力の数字文字列からなるリストを作成(例 words=[“1”, “6”, “4”]),float関数を利用して上記リストより数値からなるリストを作成
３） それらを小さい順にソートして表示、
４） それらをシャッフルして表示、
５） それらの最大値，最小値，平均，標準偏差，メジアンを計算・表示
以上のプログラムを作成せよ．【注意】statisticsパッケージを使用しないこと。
ヒント１： 文字列から数値を生成するには以下を参考
moji = input()a = float( moji )キーボードから文字列入力し変数mojiへ格納
文字列をfloat(浮動小数)型へ変換し、変数xへ格納プログラムの先頭行にコメント文で自分の氏名と学籍番号を入れておくこと# ← この記号より左側の文字列はコメントになるまとめ

リストの生成、追加、削除
リストの演算、メソッド、関数リストによる行列の表現
文字列を分割して要素を生成してリスト化： splitメソッド
リスト内包表記

第５回 レポート課題提出方法
課題のプログラムを下記の課題提出用フォルダへ、課題の番号と提出者が分かるようにファイル名を以下のようにしてアップロードせよ
第５回1TE19xxxZ名前.py
https://share.iii.kyushu-u.ac.jp/public/lRbwAAVITI5A2X4BE45t6TqQIE0UQSQUl5Bap_kZ_sjy

講義資料、および上記フォルダへのリンクは下記ホームページから
http://sysplan.nams.kyushu-u.ac.jp/gen/edu/InfoProcess/2019/index.html

【参考】データの統計量
統計データ：観察の対象について得られた測定値の集合
統計分析：統計データに含まれる規則性を見出す
平均(mean) 分散(variance)
特性値・統計量
標準偏差(standard deviation)nコのデータ：x1 , x2 , x3 ,  , xnx

平均：
分散：



標準偏差：

2

標本（サンプル）x1  x2    xn 1 n i 1 xinn1 n i 1 ( xi  x ) 2n

 2

データの散らばり具合を表現する平均 （mean）

xx1  x2    xn 1 n i 1 xinn

数学的には、各要素からの2乗距離の差2xci1 inを最小化する c を平均としている。

x中位数 （中央値，メディアン：median）
データを大きさ順に並べたとき、ちょうど中央に位置するデータの値
データの数ｎが奇数のとき、 (n+1)/2 番目の値、データの数nが偶数のとき、n/2 番目と (n/2)+1 番目の中間の値
数学的には、各要素からの絶対距離の和ni 1xi  cを最小化する c を中位数 としている。

この統計量は、解析が困難だが データの例外値（ノイズ）に影響されない という特徴がある。

最頻値 （モード：mode）
度数分布表で度数が最も多い階級値２つ以上存在することもある

工学的に非常に有用

分散の性質2

平均値を計算後でないと分散を計算できない→各データを２回読む

平均値と分散を同時に計算できる→各データを１回読込めばよい

工学的に有用1 n
1n2
 i 1 ( xi  x )  i 1 xi2  ( x ) 2nn
分散の定義式【証明】

2 

1 n2(xx)
in i 12乗の平均値

1 n i 1 ( xi2  2 xi x  x 2 )n
1 n 21 n  1
   xi   2 x   xi    n ( x ) 2  n i 1 
 n i 1   n
1 n 2   xi   2( x ) 2  ( x ) 2
 n i 1 1n i 1 xi2  ( x ) 2n（平均値）の2乗x1 nxi 1 in