文字出力と変数のつかって、文章を表示する方法は他の記事で紹介しました。
ここでは多くのデータをまとめて扱うことのできる便利なコレクションを紹介します。
【結論】pythonのコレクションは4種類ある
pythonでデータをまとめて扱うことのできるものをコレクションと呼びます。
コレクションは以下の4つがあり、それぞれの特徴や使い方が異なるものとなります。
本記事は下記の様な方におすすめです!
- pythonの変数をあつかったプログラムが書ける人
- pythonで沢山のデータまとめて管理できる方法が知りたい人
- リストや辞書などのpythonのコレクションのそれぞれの特徴を知りたい人
こちらの記事も、引き続きスッキリわかるPython入門を参考に進めていきます。
pythonのコレクションがつかいこなせるようになるメリット
コレクションがあつかえるようになると、一度に多くのデータを操作することが可能になります。
そのメリットについて、コレクションを使っているコードと、使っていないコードで比較していきたいと思います。
以下はコレクションを使っていないコードとなります。
入力コード
#数学の点数
math = 60
#国語の点数
japanese = 80
#英語の点数
english = 70
#合計点を変数totalに代入する
total = math + japanese + english
#平均点を変数avgに代入する
avg = total // 3
print('合計点:{}点'.format(total))
print('平均点:{}点'.format(avg))
実行結果
合計点:210点
平均点:70点
このコードでは、数学・国語・英語のテストの点数の合計と平均点を出力するプログラムとなります。
このプログラムを理科・社会のテスト結果も含めて処理するものにアップデートする場合、以下の作業が必要になります。
①変数に理科scienceと社会social_studiesを追加し、それぞれのテストの点数を代入する
②変数totalにscienceとsocial_studiesを加算する
③テスト結果の平均点を算出するため変数avgを算出するための割る数(教科数)を3から5に変更する
プログラムは最初から完璧であるということはまずありえないと言えます。柔軟にアップデートをすることでその時々に必要な機能や処理を実装していくことが前提です。そのため、容易にアップデートできるようにコードを書いておくことはとても重要です。
また過去に作成したコードと結果として出てくるものが変わらなくても、コードをより実践的にしたりすることをリファクタリングと呼び、チームでのアプリ開発などではメンテンナンス性や可読性を良くするために行われたりします。
こちらのサンプルコードもリファクタリングでコレクションをつかったコードに変更すれば、よりスッキリした書き方になり可読性が飛躍的に向上します。
データの集まり(コレクション)で処理を実行する
コレクションの”リスト”の書き方
リストの定義方法
変数 = [値1,値2,値3…]
ポイント
・[]の括弧で括る。
・複数の値の場合は【 , 】で区切る
・list()と書くと、空のコレクションを作成することができる
入力コード
status = [65, 70 , 40 , 80]
print(status)
実行結果
[65, 70, 40, 80]
リストの定義と値の代入。リストの場合は[]を用いて要素(値)ごとにカンマで区切ります。
上記のコードでリストに登録したすべての値を出力しています。
リストを使って要素の合計・平均を出してみる
入力コード
status = [65, 70 , 40 , 80]
total = status[0] + status[1] + status[2] + status[3]
print(f'リスト内の要素をひとつずつ足しても合計得点は{total}点です。')
total = sum(status)
print(f'リスト内の要素をsum関数で足しても合計得点は{total}点です。')
avg = sum(status)/len(status)
print(f'平均点は{avg}点です。')
実行結果
リスト内の要素をひとつずつ足しても合計得点は255点です。
リスト内の要素をsum関数で足しても合計得点は255点です。
平均点は63.75点です。
リストの中の要素を指定する
入力コード
status = [65, 70 , 40 , 80]
print(status[1])
実行結果
70
リスト内の要素は0番目からとなるので、[1]を指定すると70が返ってきます。
リストの要素を追加・変更・削除する
入力コード
jippongatana = ['ちょう','かまたり','ほうじ']
print(jippongatana)
#append関数を使ってリスト内の要素を追加する。(例:へんや、うすい、さいづち、ルフィを追加する)
jippongatana.append('へんや'),jippongatana.append('うすい'),jippongatana.append('ルフィ'),print(jippongatana)
#remove関数を使ってリスト内の要素を削除する。(例:ルフィを削除する)
jippongatana.remove('ルフィ')
print(jippongatana)
#リスト内の要素を変更する。(例:へんやをあんじに変更する)
jippongatana[3]= 'あんじ'
print(jippongatana)
print(f'リスト内の要素指定を負の数ですることもできる。添え字が-1の場合は「{jippongatana[-1]}」で-2の場合は「{jippongatana[-2]}」となる')
実行結果
[‘ちょう’, ‘かまたり’, ‘ほうじ’]
[‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’, ‘ルフィ’]
[‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’]
[‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘あんじ’, ‘うすい’]
リスト内の要素指定を負の数ですることもできる。添え字が-1の場合は「うすい」で-2の場合は「あんじ」となる
入力コード
jippongatana = ['ちょう','かまたり','ほうじ','へんや','うすい','さいづち','ふじ','あんじ','そうじろう','いわんぼう']
print(jippongatana[8])#8の要素を出力する
#スライスによるリスト内の要素範囲指定の記述方法(添え字の[]に:を記入して範囲を指定)
print(jippongatana[1:5])#1以上5未満までの要素を出力する(要するに1~4です。)
print(jippongatana[7:])#7以上の要素を出力する(要するに7を含めたあとの全部です。)
print(jippongatana[:4])#4未満までの要素を出力する(要するに3までの全部です。)
実行結果
そうじろう
[‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’]
[‘あんじ’, ‘そうじろう’, ‘いわんぼう’]
[‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’]
コレクションの”ディクショナリ”の書き方
ディクショナリの定義方法
変数 = {キー1:値1,キー2:値2,キー3:値3…}
ポイント
・{}括弧で括る
・キーと値をペアにして【キー:値】と書く
・複数の要素の場合は【 , 】で区切る
入力コード
jippongatana = {'へんや':30 , 'かまたり':45 , 'あんじ':65}
print(jippongatana)
実行結果
{‘へんや’: 30, ‘かまたり’: 45, ‘あんじ’: 65}
ディクショナリを使って要素の合計・平均を出してみる
入力コード
jippongatana = {'へんや':30 , 'かまたり':45 , 'あんじ':65, 'うすい':75, 'そうじろう':80}
ninnzuu = len(jippongatana)#要素数の値を変数ninnzuuに代入する
total = sum(jippongatana.values())#要素の値の合計を変数totalに代入する
avg = sum(jippongatana.values())//len(jippongatana)#要素の値の平均を変数avgに代入する
print('現在のjippongatanaは{}人で戦闘力の合計は{}で、平均戦闘力は{}です。'.format(ninnzuu,total,avg))
実行結果
現在のjippongatanaは5人で戦闘力の合計は295で、平均戦闘力は59です。
ディクショナリの要素を参照する
入力コード
jippongatana = {'へんや':30 , 'かまたり':45 , 'あんじ':65} print(jippongatana['かまたり'])#ディクショナリの要素を参照する際はキーを添え字にする。
実行結果
45
ディクショナリの要素を追加・変更・削除する
入力コード
jippongatana = {'へんや':30 , 'かまたり':45 , 'あんじ':65}
#ディクショナリの要素の追加と変更は同じ書き方
jippongatana['うすい'] = 75#キー'うすい'で値75を追加
jippongatana['かまたり'] = 40#'かまたり'の値を45→40に変更
print(jippongatana)
#ディクショナリの要素の削除
del jippongatana['へんや']#'へんや'を削除する。
print(jippongatana)
実行結果
{‘へんや’: 30, ‘かまたり’: 40, ‘あんじ’: 65, ‘うすい’: 75}
{‘かまたり’: 40, ‘あんじ’: 65, ‘うすい’: 75}
コレクションの”タプル”の書き方
続いてのコレクションは”タプル“となります。次のセットと同様にリストやディクショナリと比較して使用頻度は少ないかもしれませんが、コレクションの1つです。
タプルの定義方法
変数=(値1,値2,値3,…)
ポイント
・()括弧で括っている
・複数の要素の場合は【 , 】で区切る
入力コード
jippongatana = ('ちょう','かまたり','ほうじ','へんや','うすい')
donut_price = (100,120,150,180,200)
print(jippongatana)#タプルの要素(jippongatana)を全て出力する
print(donut_price)#タプルの要素(donut_price)を全て出力する
print(type(jippongatana))#jippongatanaのデータ型を出力する
print(type(donut_price))#donut_priceのデータ型を出力する
実行結果
(‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’)
(100, 120, 150, 180, 200)
<class ‘tuple’>
<class ‘tuple’>
タプルはリストとよく似ているコレクションですが、大きく異なるポイントとしては、要素の追加・変更・削除ができないところとなります。イメージとしては中身が書き換えられないリストということで覚えておくと良いでしょう。
タプルを使って要素の合計・平均を出してみる
リストやディクショナリと同様にSUM関数やLEN関数を用いて、タプルの要素内の合計や平均を出すことは可能です。
入力コード
donut_price = (100,120,150,180,200)
total = sum(donut_price)
avg = sum(donut_price)//len(donut_price)
print('ドーナツの合計額は{}円で、平均価格は{}円です。'.format(total,avg))
実行結果
ドーナツの合計額は750円で、平均価格は150円です。
タプルの要素を指定する
要素を指定する場合も他のコレクション同様に[]で添え字を付けて書きます。
但し、コレクションの要素は0番から始まることには注意してください。
下のコードではタプルのjippongatanaの5番目の”うすい”を添え字[4]を指定することで表示しています。
同様にタプルのdonut_price[2]を指定して、3番目の150の要素を指定しています。
入力コード
jippongatana = ('ちょう','かまたり','ほうじ','へんや','うすい')
donut_price = (100,120,150,180,200)
print('5番目の要素は{}です。'.format(jippongatana[4]))#タプル要素内の5番目の要素を出力する。※添え字は0番から指定します。
print('3番目の要素は{}です。'.format(donut_price[2]))#タプル要素内の3番目の要素を出力する。※添え字は0番から指定します。
実行結果
5番目の要素はうすいです。
3番目の要素は150です。
また、リストでも使った下記のようなスライスも可能です。
入力コード
jippongatana = ('ちょう','かまたり','ほうじ','へんや','うすい')
print('2から4番目の要素は{}です。'.format(jippongatana[1:4]))
実行結果
2から4番目の要素は(‘かまたり’, ‘ほうじ’, ‘へんや’)です。
入力コード
donut_price = (100,120,150,180,200)
print('1番目から3番目までの要素は{}です。'.format(donut_price[:3]))
実行結果
1番目から3番目までの要素は(100, 120, 150)です。
※添え字は0番から指定しますので1番目から5番目未満となります。
タプルの要素数が一つだった場合の書き方
コレクションは複数のデータを扱うことが一般的ですが、タプル型で要素が一つだった場合の注意点について説明します。
入力コード
jippongatana = ('そうじろう')#要素数が一つの場合のタプル定義
print(type(jippongatana))#type関数によるデータ型の出力
実行結果
<class ‘str’>
あれ?文字列(str)型と認識されたよ。
入力コード
jippongatana = ('そうじろう',)#要素数が一つの場合のタプル定義 ※カンマをつけること
print(type(jippongatana))#type関数によるデータ型の出力
実行結果
<class ‘tuple’>
要素がひとつしかなくても、”,”をつけることでタプルだと認識されたね。
コレクションの”セット”の書き方
セットもコレクションの一つとなりますが、リストと似ています。
リストと異なる点を抑えておきましょう。
セットの特徴
重複した値を格納することができない
添え字やキーという概念がなく、特定の要素に代入・参照する方法が存在しない
添え字がないため、要素は順序をもたない
appned関数の代わりにadd関数で要素を追加する
コレクションのセットは、決まった種類を管理することに向いています。
信号機の色の赤・青・黄など特に序列をもたない要素を代入するにはセットは使えるでしょう。
セットの定義方法
変数={値1,値2,値3,…}
ポイント
・{}括弧で括る
・複数の要素の場合は【 , 】で区切る
入力コード
shingou = {'赤','黄','青'}
finger = {'親','人指し','中指','薬指','小指','人指し'}#人指しを重複して登録
donut_price = {100,120,150,180,200}
print(shingou)
print(type(shingou))
print(finger)#人指しは一つのみ存在し、重複していない
print(type(finger))
print(donut_price)
print(type(donut_price))
実行結果
{‘赤’, ‘青’, ‘黄’}
<class ‘set’>
{‘中指’, ‘人指し’, ‘薬指’, ‘小指’, ‘親’}
<class ‘set’>
{100, 200, 180, 150, 120}
<class ‘set’>
セットを使って要素の合計・平均を出してみる
入力コード
donut_price = {100,120,150,180,200}
total = sum(donut_price)
avg = sum(donut_price)//len(donut_price)
print('ドーナツの合計額は{}円で、平均価格は{}円です。'.format(total,avg))
実行結果
ドーナツの合計額は750円で、平均価格は150円です。
セットの要素を追加・削除する
入力コード
shingou = {'赤','黄','青'}
donut_price = {100,120,150,180,200}
shingou.add('紫')#紫の要素を追加する。
print(shingou)
shingou.remove('黄')#黄の要素を削除する。
print(shingou)
#discard('黄')の記述も可。removeは引数に指定した要素が存在しない場合エラー
donut_price.add(85)#85の要素を追加する。
print(donut_price)
donut_price.discard(180)#180の要素を削除する。
print(donut_price)
#remove(180)の記述も可。discardは引数に指定した要素が存在しない場合も正常終了
実行結果
{‘赤’, ‘紫’, ‘青’, ‘黄’}
{‘赤’, ‘紫’, ‘青’}
{100, 200, 180, 85, 150, 120}
{100, 200, 85, 150, 120}
データの集まり(コレクション)で処理を実行する応用編
コレクションの相互変換
これまで4つのコレクションを紹介しましたが、それぞれの相互変換が可能です。
変換する際の記述方法は下記のとおりです。
関数 | 関数のはたらき | 補足説明 |
---|---|---|
list関数 | 渡されたものをリストに変換する。 | ディクショナリやセットから変換された場合は要素の順序が保証されない |
tuple関数 | 渡されたものをタプルに変換する。 | ディクショナリやセットから変換された場合は要素の順序が保証されない |
set関数 | 渡されたものをセットに変換する。 | リストやタプルから変換された場合は要素の重複が排除される |
入力コード
jippongatana = ['ちょう','かまたり','ほうじ','へんや','うすい','かまたり']
print(jippongatana)
print(type(jippongatana))
Pokemon = ('ピカチュウ','フシギダネ','ゼニガメ','ヒトカゲ','フシギダネ')
print(Pokemon)
print(type(Pokemon))
shingou = {'赤','黄','青'}
print(shingou)
print(type(shingou))
print(list(Pokemon))#タプル(pokemon)をリストに変換して表示する。
print(list(shingou))#セット(shigou)をリストに変換して表示する。 print(tuple(jippongatana))#リスト(jippongatana)をタプルに変換して表示する。 print(tuple(shingou))#セット(shingou)をタプルに変換して表示する。 print(set(jippongatana))#リスト(jippongatana)をセットに変換して表示する。 print(set(Pokemon))#タプル(Pokemon)をセットに変換して表示する。
実行結果
[‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’, ‘かまたり’]
<class ‘list’>
(‘ピカチュウ’, ‘フシギダネ’, ‘ゼニガメ’, ‘ヒトカゲ’, ‘フシギダネ’)
<class ‘tuple’>
{‘黄’, ‘青’, ‘赤’}
<class ‘set’>
[‘ピカチュウ’, ‘フシギダネ’, ‘ゼニガメ’, ‘ヒトカゲ’, ‘フシギダネ’]
[‘黄’, ‘青’, ‘赤’]
(‘ちょう’, ‘かまたり’, ‘ほうじ’, ‘へんや’, ‘うすい’, ‘かまたり’)
(‘黄’, ‘青’, ‘赤’)
{‘ちょう’, ‘ほうじ’, ‘うすい’, ‘へんや’, ‘かまたり’}
{‘ピカチュウ’, ‘フシギダネ’, ‘ヒトカゲ’, ‘ゼニガメ’}
ディクショナリからリスト・タプル・セットへ変換するとキー部分だけが使われます。
ディクショナリの値を使いたい時の書き方は下記のとおりです。
入力コード
jippongatana = {'へんや':30 , 'かまたり':45 , 'あんじ':65}
print(jippongatana)
#リストへの変換
print(list(jippongatana))
print(list(jippongatana.values()))
#タプルへの変換
print(tuple(jippongatana))
print(tuple(jippongatana.values()))
#セットへの変換
print(set(jippongatana))
print(set(jippongatana.values()))
実行結果
{‘へんや’: 30, ‘かまたり’: 45, ‘あんじ’: 65}
[‘へんや’, ‘かまたり’, ‘あんじ’]
[30, 45, 65]
(‘へんや’, ‘かまたり’, ‘あんじ’)
(30, 45, 65)
{‘へんや’, ‘かまたり’, ‘あんじ’}
{65, 45, 30}
入力コード
ディクショナリへの変換は少し特殊なものとなります。
上記3つのコレクションとは別で説明しますが、キーと値の2つのコレクションで構成して変換します。
l_jippongatana = ['ちょう','かまたり','ほうじ','へんや','あんじ','うすい','そうじろう']
l_sentouryoku = [35,45,15,30,75,65,80]
t_jippongatana = ('ちょう','かまたり','ほうじ','へんや','あんじ','うすい','そうじろう')
t_sentouryoku = (35,45,15,30,75,65,80)
s_jippongatana = {'ちょう','かまたり','ほうじ','へんや','あんじ','うすい','そうじろう'} s_sentouryoku = {35,45,15,30,75,65,80}
print(dict(zip(l_jippongatana,l_sentouryoku)))#リストからディクショナリ print(dict(zip(t_jippongatana,t_sentouryoku)))#タプルからディクショナリ print(dict(zip(s_jippongatana,s_sentouryoku)))#セットからディクショナリ
実行結果
{‘ちょう’: 35, ‘かまたり’: 45, ‘ほうじ’: 15, ‘へんや’: 30, ‘あんじ’: 75, ‘うすい’: 65, ‘そうじろう’: 80}
{‘ちょう’: 35, ‘かまたり’: 45, ‘ほうじ’: 15, ‘へんや’: 30, ‘あんじ’: 75, ‘うすい’: 65, ‘そうじろう’: 80}
{‘ちょう’: 65, ‘ほうじ’: 35, ‘あんじ’: 75, ‘うすい’: 45, ‘そうじろう’: 15, ‘へんや’: 80, ‘かまたり’: 30}
{‘ちょう’: 35, ‘かまたり’: 45, ‘ほうじ’: 15, ‘へんや’: 30, ‘あんじ’: 75, ‘うすい’: 65, ‘そうじろう’: 80}
リスト×タプル、リスト×セット、タプル×リスト、タプル×セット、セット×リスト、セット×タプルなどの混在でもディクショナリへの変換可能です。
コレクションのネスト
コレクションの2重構造なども作成可能です。
例1.ディクショナリの中にディクショナリをネストしてみます。
入力コード
henya = {'腕力':15,'体力':15,'素早さ':60}
kamatari = {'腕力':45,'体力':50,'素早さ':40}
anji = {'腕力':90,'体力':85,'素早さ':20}
jippongatana = {
'へんや':henya,
'かまたり':kamatari,
'あんじ':anji
}
print(jippongatana)
実行結果
{‘へんや’: {‘腕力’: 15, ‘体力’: 15, ‘素早さ’: 60}, ‘かまたり’: {‘腕力’: 45, ‘体力’: 50, ‘素早さ’: 40}, ‘あんじ’: {‘腕力’: 90, ‘体力’: 85, ‘素早さ’: 20}}
例2.ディクショナリにセットをネストしてみます。
入力コード
jippongatana_hobbies = {
'へんや':{'飛行','軽量化'},
'かまたり':{'買物','物色','お茶'},
'あんじ':{'鍛錬','瞑想','読経'}
}
print(jippongatana_hobbies)
実行結果
{‘へんや’: {‘軽量化’, ‘飛行’}, ‘かまたり’: {‘お茶’, ‘物色’, ‘買物’}, ‘あんじ’: {‘瞑想’, ‘読経’, ‘鍛錬’}}
例3.リストの中にリストをネスト(2次元リスト)してみます。
入力コード
kamatari = [45,50,40]
anji = [90,85,20]
jippongatana = [kamatari,anji]
print(jippongatana)
print(jippongatana[0])
print(jippongatana[1])
print(jippongatana[0][1])#jippongatanaリストの0番目(kamatari)の1番目は50 print(jippongatana[1][0])#jippongatanaリストの1番目(anji)の0番目は90
実行結果
[[45, 50, 40], [90, 85, 20]]
[45, 50, 40]
[90, 85, 20]
50
90
集合演算
集合演算とは2つのセットの共通点や違いを探す処理のことです。
こういった演算処理はデータ分析をおこなう上では非常に役立つものとなります。
入力コード
jippongatana_hobbies = {
'かまたり':{'買物','物色','お茶'},
'あんじ':{'鍛錬','瞑想','読経','お茶'}
}
common_hobbies = jippongatana_hobbies['かまたり'] & jippongatana_hobbies['あんじ']
print(common_hobbies)#2つのセット(かまたりとあんじの趣味)に共通する値を出力する
dragonquest ={1,2,3,4,5,6,7,8,9,10,11}
biohazard = {0,1,2,3,4,5,6,7}
#和集合(双方に存在する全ての値を列挙)
print(dragonquest | biohazard)
#積集合(双方に存在し、共通している値を列挙)
print(dragonquest & biohazard)
#差集合(dragonquestに存在し、biohazardに存在しない値を列挙)
print(dragonquest - biohazard)
#対称差(双方の差分の値を列挙)
print(dragonquest ^ biohazard)
実行結果
{‘お茶’}#積集合
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}#和集合
{1, 2, 3, 4, 5, 6, 7}#積集合
{8, 9, 10, 11}#差集合
{0, 8, 9, 10, 11}#対称差
「Pythonでリストやディクショナリなど変数をまとめて扱う」まとめ
今回はコレクションの使い方について紹介しました。
最後に今回のコレクションに関するまとめを表にしておきます。
特徴 | リスト | ディクショナリ | タプル | セット |
---|---|---|---|---|
格納内容 | 複数の値 | 複数のキーと値のペア | 複数の値 | 複数の値 |
定義方法 | [値1,値2…] | {キー1:値1,キー2:値2} | (値1,値2…) | {値1,値2…} |
個別要素の参照方法 | 変数名[添え字] | 変数名[キー] | 変数名[添え字] | 困難(※) |
要素の追加 | 変数名.append(値) | 変数名[キー]=値 | できない | 変数名.add(値) |
要素の変更 | 変数名[添え字]=値 | 変数名[キー]=値 | できない | 困難(※) |
要素の削除 | 変数名.remove(値) | del 変数名[キー] | できない | 変数名.remove(値) |
要素の順序関係 | あり | なし | あり | なし |
重複値の格納 | できる | キーはできない 値はできる |
できる | できない |
集合演算 | できない | できない | できない | できる |
Len関数による要素数の取得 | できる | できる | できる | できる |
Sum関数による合計値の取得 | できる | できない | できる | できる |
スライスの利用 | できる | できない | できる | できない |
+演算子による連結 | できる | できない | できる | できない |
コレクションをうまく活用できれば、沢山のデータを扱うプログラムを効率的に書いていくことが出来るようになると思います。
次の「条件分岐」の書き方についてはこちらで紹介してます。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント