練習問題:オブジェクトの性質 | データ構造#
Jupyter Notebook ファイルの準備
課題用に「practice8-5.ipynb」 という名前で Jupyter Notebook のファイルを作成してください。
この練習問題を通して、 オブジェクトの性質 | データ構造 で学習した内容を改めて確認してください。
ミュータブルとイミュータブル#
問題#
次の値が、それぞれ集合の要素として追加できるかできないかを予想した上で、実際にコードを書いて結果を確かめてください。
('a', 'b', 'c')
['a', 'b', 'c']
{'a', 'b', 'c'}
{'a' : 1 , 'b': 2, 'c': 3}
(('a', 1), ('b', 2), ('c', 3))
(['a', 1], ['b', 2], ['c', 3])
解答例を見る
集合の要素にはイミュータブルかつハッシュ可能なオブジェクトしか追加できません。リストや集合、辞書はミュータブルであるため、集合の要素にはできません。一方でタプルはイミュータブルであるため、ひとつめの条件は満たしていますが、(['a', 1], ['b', 2], ['c', 3])
のように、その要素がミュータブルである場合は、二つ目の「ハッシュ可能な」という条件を満たさないため、追加することができません。
sample_set = set()
# 要素として追加できるもの
sample_set.add(('a', 'b', 'c'))
sample_set.add((('a', 1), ('b', 2), ('c', 3)))
# 要素として追加できないもの(例外 TypeError が送出される)
sample_set.add(['a', 'b', 'c'])
sample_set.add({'a', 'b', 'c'})
sample_set.add({'a' : 1 , 'b': 2, 'c': 3})
sample_set.add((['a', 1], ['b', 2], ['c', 3]))
イテラブル#
問題1#
文字列は他のイテラブルなオブジェクトと同様に len()
関数を使用して、文字列の長さ(文字数)を取得できます。これを利用して、次の文字列を要素にもつリスト fruits
から、各要素をキーに、その文字列の長さを値にもつ新たな辞書 fruits_dict
を作成してください。
fruits = ['apple', 'strawberry', 'banana', 'orange']
# ここに fruits_dict を作成するコードを記述
print(fruits_dict) # {'apple': 5, 'strawberry': 10, 'banana': 6, 'orange': 6}
解答例を見る
次のように、辞書の内包表記と組み合わせると、コードをより簡潔にまとめることができます。
fruits = ['apple', 'strawberry', 'banana', 'orange']
fruits_dict = {name:len(name) for name in fruits}
print(fruits_dict)
問題2#
次の2つの集合 clothes
と colors
から、洋服とその色の組み合わせを表すリスト styles
を、 zip
関数を用いて作成してください。なお、洋服と色の組み合わせをすべて表す必要はなく、ひとつの洋服に対してひとつの色があてがわれていればよく、その組み合わせも問いません。
clothes = {'帽子', 'シャツ', 'ズボン', '靴'}
colors = {'緑', '青', '白', '黒'}
解答例を見る
zip
関数とリストやタプルのコンストラクタを組み合わせると、2 つのイテラブルの要素を組み合わせたリストやタプルが簡単に作成できます。
clothes = {'帽子', 'シャツ', 'ズボン', '靴'}
colors = {'緑', '青', '白', '黒'}
styles = list(zip(clothes, colors))
print(styles)
シーケンス#
問題1#
文字列はシーケンスなオブジェクトであるため、リストやタプルと同様に、スライスが利用できます。文字列 'たきぬつきね'
から、以下に指定した範囲の文字をそれぞれ切り出して表示するスクリプトを作成してください。
4 文字目から 5 文字目まで
先頭から 2 つおきに末尾まで
2 文字目から 2 つおきに末尾まで
解答例を見る
インデックスが 0
から始まることや、スライスで切り出された文字列に 終了値
の文字は含まれないことに気を付けてください。
letters = 'たきぬつきね'
# 1
print(letters[3:5]) # つき
# 2
print(letters[::2]) # たぬき
# 3
print(letters[1::2]) # きつね
問題2#
ある野球における選手の打順を表したタプル batting_order
から、次の形式で打順を出力するスクリプトを enumrate
関数を利用して作成してください。
batting_order = ('小林', '鈴木', '佐藤', '田中', '川合',
'福留', '石井', '小笠原', '田淵')
【 期待される出力 】
打順1: 小林
打順2: 鈴木
打順3: 佐藤
打順4: 田中
打順5: 川合
打順6: 福留
打順7: 石井
打順8: 小笠原
打順9: 田淵
解答例を見る
要素の値と順番を表す数の両方を繰り返し取得したい場合は、enumerate
関数を使うと、カウント用の変数を別に用意する必要がなく、コードが短くまとまります。
batting_order = ('小林', '鈴木', '佐藤', '田中', '川合',
'福留', '石井', '小笠原', '田淵')
for index, elem in enumerate(batting_order):
print(f'打順{index + 1}: {elem}')
# enumrate() 関数の戻り値は先頭を 0 とするため index + 1 としています。