独学でPython『辞書操作』の基本を学ぶ【プログラミング基礎練習問題1】
(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)
プログラミングの基本を学んだ方からよくこのような質問を頂きます。
悩むペン銀
Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい
こう言った『次に何すればいいか分からない』と言う疑問に対し、
僕からの回答を言うと、
『問題を沢山解きましょう』
です。
これこそプログラミング力飛躍的に向上させる一番の近道です。
このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題をPythonを駆使して解決できるようになるはずです。
本シリーズを習得した後、
得ることができる主な知識・内容は以下3点です。
本記事の内容
この記事を書いている僕は国立大学にてCSの学位を保有しており
エンジニアとしての仕事では現実問題を解き続けています。
実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
新しい思考プロセスを学ぶことができます。
それではやっていきましょう。
目次
(注) 問題のレベルについて
以下に示す問題のレベルは五段階に分割しています。
あくまでも目安なので、自分が解いてみたい問題から手をつけてみてください。
プログラミングの勉強は継続が重要です。なので楽しさを優先しましょう!
【問題1】辞書操作 レベル: easy
辞書の要素をjsonファイルに書き込め
引数として辞書を渡された時、辞書の要素をjsonファイルに書き込む関数を作成してほしい。関数名はwrite_elmentsとしよう。
具体例
実装したwrite_elements関数に実際に引数を渡した場合、
以下のような結果となるように実装してください。
注意事項
以下の要点を満たすような設計を行います。
テスト
以下のテストコードをエラー無く通過できれば正解です。
作成した関数を以下のように自分の環境に書き込んで完成させ
実行してみましょう。
def write_elements(dict): # ここにコードを入力してください return your_answer def read_elements(): import json with open('tmp.json') as f: dict2=json.load(f) return dict2 if __name__ == '__main__': dict1={'apple':3,'grape':12,'strawberry':32} write_elements(dict1) assert read_elements() == {'apple':3, 'grape':12, 'strawberry':32} print('Pass!!')
解答例
def return_the_last_element(arg):
return arg[-1]
解説付き解答例
def return_the_last_element(arg):
return arg[-1] # リスト末尾より一つの要素を取り出す
更に深く学ぶ+α
Jsonファイルとは
JSONはJava Script Object Notationの事で同じもしくは異なるネットワーク間でのデータの送受信や格納ができるファイル形式の事です。 一般的にREST API等で良く利用されます。(webシステムを外部から利用する為のプログラムの呼出規約(API))
JSONはコンパイルされておらず、人間が直接ファイルを読める点も利点です。 以下のような形式でPythonでの辞書をそのままファイルに保存する事ができます。
{
"Name": "Alex",
"Age": 19,
"Gender": "Male",
"Hobby":"Soccer"
"Favorite food":["apple","pizza","Udon"]
}
PythonでJsonファイルの読み書きを行う
Pythonの標準ライブラリのjsonモジュールを使うとJson形式のファイル等を解析して辞書などのデータ構造をオブジェクトとして読み込めます。
公式:JsonについてPython公式ドキュメント
Pythonでの辞書をJsonファイル形式で書き込む
辞書オブジェクトを書き込む場合は以下のようにします。
import json
dict={'wine':1000,'pizza':1200,'pickle':300}
with open('new_file.json','w') as f:
json.dump(dict, f, indent=1)
保存されたコードは以下のようにして確認します。
JsonファイルをPythonの辞書として読み込む
with open('new_file.json') ass f:
result = json.load(f)
print(result)
{
'wine':1000,
'pizza':1200,
'pickle':300
}
【問題2】辞書操作 レベル: easy
2つの辞書をマージせよ
引数として受け取る2つの辞書について、これらをマージし、1つの辞書にして返すmerge_dictionary関数を実装せよ。
具体例
作成したmerge_dictionary関数に引数を与えた時、
結果は以下のようになります。
merge_dictionary(dic1,dic2)→{“Apple”:[12,33,23,23],”Orange”:[22,14,12,12,12],”cherry”:[32,323,43,12],”Melon”:[45,34,1,31],”lemon”:[23,33],”broccoli”:[2,4,2,5,6],”Tomato”:[3,23,53,3],”lettuce”:[25,25,2,4,6]}
注意事項
以下の要件にしたがって関数を設計してください
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、確認してみましょう。
# This will get executed each time the exercise gets initialized
def merge_dictionary(dict1,dict2):
#ここにコードを入力してください
return your_answer
dict1={'red':3,'blue':4,'black':2}
dict2={'pink':1,'purple':5,'green':9}
assert merge_dictionary(dict1, dict2) == {'red':3,'blue':4,'black':2,'pink':1,'purple':5,'green':9}
dict1={'red':[2,5,2],'blue':[666,63,43],'black':[2,5,7]}
dict2={'pink':[1,5,2],'purple':[7,4,5],'green':[1,4,2]}
assert merge_dictionary(dict1, dict2) == {'red':[2,5,2],'blue':[666,63,43],'black':[2,5,7],'pink':[1,5,2],'purple':[7,4,5],'green':[1,4,2]}
print('Pass!!')
<-
) to create the variable a
.解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。
def merge_dictionary(dic1, dic2):
dic3 = dic1.copy()
dic3.update(dic2)
return dic3
解説付き解答例
def merge_dictionary(dic1, dic2):
dic3 = dic1.copy() #引数dic1の辞書をdic3に保持する(dic1とは別物)
dic3.update(dic2) #引数dic2の辞書をdic3に追加する
return dic3
更に深く学ぶ+α
辞書の要素を全てコピーする
辞書に格納されている値とKeyを全てコピーするには.copy()
のデータ型関数を利用します。
別の辞書の要素を使い、既存の辞書を更新する
すでに作成されている辞書に別の辞書の要素を使いするには.update()
のデータ型関数を利用します。引数には使いしたい辞書を指定します。
また以下のように重複するkeyが存在する場合、既存のkeyの値は上書きされます
dict1={'apple':1,'peach':2,'lemon':3}
dict2={'apple':3,'graph':3,'orenge':3}
dict1.update(dict2)
print(dcit1)
{'apple': 3, 'peach': 2, 'lemon': 3, 'graph': 3, 'orenge': 3}
【問題3】辞書操作 レベル: normal
Keyより新しい辞書を作り出せ
引数で辞書と辞書内のKeyが渡される、渡されたKeyを元に、辞書から新しい辞書を作成するextract_dict関数を実装せよ。
具体例
実装したextract_dict関数に与える引数とその結果は以下のようになるようにしましょう。
注意事項
以下の要点を満たすような設計を行います。
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、確認してみましょう。
# This will get executed each time the exercise gets initialized
def extract_dict(dic,keys):
ここにコードを入力してください
return your_answer
dic={"name":"Alex","age":19,"gender":"male","height":190}
keys=["name","gender"]
assert extract_dict(dic,keys) == {"name":"Alex","gender":"male"}
dic={"name":"Kate","age":23,"gender":"female","height":160}
keys=["name","height"]
assert extract_dict(dic,keys) == {"name":"Kate","height":160}
dic={"name":"John","age":25,"gender":"male","height":183}
keys=["name","age"]
assert extract_dict(dic,keys) == {"name":"John","age":25}
print('Pass!!')
<-
) to create the variable a
.解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。
def extract_dict(dic, keys):
result= {i: dic[i] for i in keys}
return result
解説付き解答例
def extract_dict(dic, keys):
result = {i: dic[i] for i in keys} # 引数keysより要素(key)を取り出し、このkeyに該当する要素を引数dicより取り出す。これらを新しい辞書resultに逐次、格納する。
return result
更に深く学ぶ+α
内包表記でfor文を一行で書く
リスト内包表記がPythonではサポートされています。 一般的なfor文は以下のように描きました。
data=[1,2,3,4,5]
new_data = []
for idx in data:
new_data.append(idx)
一方で内包表記は次のように書けます
data=[1,2,3,4,5]
new_data=[idx for idx in data]
この書き方はとてもシンプルで簡単に理解できるので便利です。
条件分岐も以下のように書くことができます。
data=[1,2,3,4,5]
new_data = [idx for idx in data if idx%2==0]
print(new_data)
[2,4]
これはリスト内の数字で2で割ったときに余りが0な数字(偶数)であれば
新しいリストに追加する内包表記です。
通常のif文で書くと長くなってしまいますが内包表記を使うとここまでシンプルに書くことができます。