リストと辞書とは?
まずリストと辞書について簡単に確認してみよう。
リスト
リストとは、複数のデータをまとめたデータ構造の一つ、 [ ] で要素を囲んで表現する。
例えば以下のコードは、 s というリストの中に 100 500 1000 5000 10000という要素が格納されている
s = [100, 500, 1000, 5000, 10000]
print(s)
[100, 500, 1000, 5000, 10000]
また、リストの中には数値だけでなく文字列やリストをも格納することが出来る。
wallet = [["100円", "500円", "1000円", "5000円", "10000円"],["杏林堂のレシート","セブンのレシート","マックのレシート"]]
print(wallet)
[[‘100円’, ‘500円’, ‘1000円’, ‘5000円’, ‘10000円’], [‘杏林堂のレシート’, ‘セブンのレシート’, ‘マックのレシート’]]
リスト内の要素には index (順番)が割り振られている。これはコードを見てもらったほうが分かりやすいと思う
s = [100, 500, 1000, 5000, 10000]
print(s[0])
100
wallet = [["100円", "500円", "1000円", "5000円", "10000円"],["杏林堂のレシート","セブンのレシート","マックのレシート"]]
print(wallet[0][0])
print(wallet[1][2])
100円
マックのレシート
1つ目のコードではリスト内の0番目の要素である 100 を出力している。
2つ目のコードではwalletの中の0番目のリスト[“100円”, “500円”, “1000円”, “5000円”, “10000円”]の0番目の要素である 100円を、1番目のリストである[“杏林堂のレシート”,”セブンのレシート”,”マックのレシート”]の2番めの要素である マックのレシート を出力している。
リストでよく使うメソッド
appendリストの最後に要素を追加する
list = [1,2,3]
list.append(4)
print(list)
[1,2,3,4]
insertリストの先頭に要素を追加する
list = [1,2,3]
list.insert(4)
print(list)
[4,1,2,3]
popリストから値を取り出す
list = [1,2,3]
list.pop(2) #indexを指定
print(list)
[1,2]
del削除
list = [1,2,3]
del list[0] #indexを指定
print(list)
[2,3]
remove指定した要素の最初の一つを消す。
list = [1,2,1,3]
list.remove(1)
print(list)
[2,1,3]
辞書型
辞書型は キー と 値 から構成されるその名の通り辞書っぽいデータ構造のこと。{}で囲って表現する。
{ key : value }
d = {"index":1,"索引":1}
辞書の値を取得するには以下のように書く。
d = {"index":1,"索引":2}
print(d["index"])
print(d["索引"])
1
2
キーに値を入れる場合は以下のように書く。
d = {"index":1,"索引":2}
print(d["index"] = "11111"
print(d)
{‘index’: ‘11111’, ‘索引’: 2}
辞書型でよく使うメソッド
keysキーのみ確認する
d = {"index":1,"索引":2}
print(d.keys())
dict_keys([‘index’, ‘索引’])
values値のみ確認する
d = {"index":1,"索引":2}
print(d.values())
dict_values([1, 2])
get値を出力する
get(key[, default])
d = {"index":1,"索引":2}
print(d.get("index"))
print(d.get("python")) #デフォルトキーなし
print(d.get("dictionary",3)) #デフォルトキーあり
1
None ※デフォルトキーを設定しない状態で存在しないキー(例python)を取得した場合はNoneを返す。
3 ※デフォルトキーを設定した状態で存在しないキーを取得した場合はデフォルトキーを返す。
リストの要素を格納した辞書を作る
さてここからが本題だ。「リストの要素を格納した辞書」を作ってみよう
まずリストの要素を格納した”辞書”とはどうのような辞書なのかゴールを先に確認してみる。
list = [1, 2, 1, 4, 3, 2, 3, 4, 4]
↓↓
dict={1: 2, 2: 2, 4: 3, 3: 2}
この辞書はlistの中のバラバラな要素を {要素名 : カウント数} という整理整頓した形で表示している。
このような整理整頓を行うには
- 空の辞書を作成
- リストの中の要素を順に取り出す
- 取り出された要素が辞書に存在するかどうか確認する(要素を取得)。
- 存在◯・その値を取得 / 存在✕ならデフォルト値を追加
- 要素のカウント数+1
- 取り出された要素が辞書に存在するかどうか確認する(要素を取得)。
- 2に戻る(すべての要素を数え終えるまで)
という順序を踏む必要がある。これを部分的にコードに起こすと
- 空の辞書を作成 #dictionary = {}
- リストの中の要素を順に取り出す #for? in?
- 取り出された要素が辞書にキーとして存在するかどうか確認する。 #辞書[キー]
- 存在するならその値を取得 / 存在しないならデフォルト値を追加 #get(キー、デフォルトのvalue)
- 要素のカウント数+1 #…value)+1
- 取り出された要素が辞書にキーとして存在するかどうか確認する。 #辞書[キー]
- 2に戻る(すべての要素を数え終えるまで)
そしてそれをコードに起こすと
dictionary = {}
for key in list:
dictionary[key] = dictionary.get(key, 0) + 1
元となるリスト出力するためのprint()を追加すると
list = [1, 2, 1, 4, 3, 2, 3, 4, 4]
dictionary = {}
for key in list:
dictionary[key] = dictionary.get(key, 0) + 1
print(dictionary)
となる。
順を追って解説すると
元となるリスト
空のリストを作成
「for 要素 in イテラルオブジェクト」
イテラルオブジェクト(複数の要素を持つデータのこと、リストやタプル等)から順に要素を一つずつ取り出すというテンプレート
辞書[要素名]= 辞書.get(要素名,デフォルト値)+カウント
- dictionary[value] 辞書dictionaryの中にlistから取り出されたキーが存在するか確認する
存在しない場合(例:一番最初のループ,key=1)
dictionary[1]
存在する場合(例:一番最後のループ,key=4)
dictionary[4] - dictionary.get(value, 0) get()で辞書dictionaryの中のvalueに対応する値を取得する。
存在しない場合
dictionary.get(key, 0)
※1というキーは存在しないので1というキーにデフォルトvalue”0″を加え(1:0)という辞書要素を返す
存在する場合
dictionary.get(4, 2) - +1 valueに+1する。
printの出力
まとめと問題
いかがだっただろうか?
dictionary[value] = dictionary.get(key, 0) + 1
コイツが中々の曲者だったと思うが、別に隅々まで理解できなくとも、
「リストの要素を格納した辞書」を作る時は
list = []
dictionary = {}
for key in list:
dictionary[key] = dictionary.get(key, 0) + 1
print(dictionary)
というパターンを使うと覚えておけば良いと思う。
この1問に時間をかけるよりget()やforループを扱った他の問題を解いたほうが知識が定着するし応用も効く。
じゃあパターンを覚えて練習問題を解いてみよう。
問題
あなたの財布にはいっている小銭をリストにし、それを種類ごとカウントする辞書を作ってください。
期待する出力
{'100円': 2, '10円': 2, '1円': 3, '500円': 1}
答え
wallet = ["100円", "100円", "10円", "1円", "1円", "1円", "10円","500円"]
coins = {}
for coin in wallet:
coins[coin] = coins.get(coin, 0) + 1
print(coins)
# カツカツです