jupyter lab で勉強しながら遊んでたら、プログラムが思ってたのと違う挙動をし始めました
下の画像がその時書いたプログラムと実行結果です。
python
1def init(data): 2 data['first'] = {} 3 data['middle'] = {} 4 data['last'] = {} 5 6def lookup(data, label, name): 7 return data[label].get(name) 8 9def store(data, *full_names): 10 for full_name in full_names: 11 names = full_name.split() 12 if len(names) == 2: 13 names.insert(1, '') 14 labels = 'first', 'middle', 'last' 15 for label, name in zip(labels, names): 16 people = lookup(data, label, name) 17 if people: 18 people.append(full_name) 19 else: 20 data[label][name] = [full_name] 21 22 23 24d = {} 25init(d) 26store(d, 'Han Solo', 'Aha-n Solo') 27store(d, 'Luke Skywalker', 'Anakin Skywalker', 'Anahaimu Skywalker', 'Aha~n Skywalker') 28print(d) 29print(lookup(d, 'last', 'Skywalker'))
実行結果
{'first': {'Aha-n': ['Aha-n Solo'], 'Aha~n': ['Aha~n Skywalker']}, 'middle': {'': ['Aha-n Solo', 'Aha~n Skywalker']}, 'last': {'Solo': ['Aha-n Solo'], 'Skywalker': ['Aha~n Skywalker']}} ['Aha~n Skywalker']
修正後のコード
python
1def init(data): 2 data['first'] = {} 3 data['middle'] = {} 4 data['last'] = {} 5 6def lookup(data, label, name): 7 return data[label].get(name) 8 9def store(data, *full_names): 10 for full_name in full_names: 11 names = full_name.split() 12 if len(names) == 2: 13 names.insert(1, '') 14 labels = 'first', 'middle', 'last' 15 for label, name in zip(labels, names): 16 people = lookup(data, label, name) 17 if people: 18 people.append(full_name) 19 else: 20 data[label][name] = [full_name]
store関数を用いて複数のデータを入れられるようにしたつもりです。
store(d, 'Han Solo') のように一つのデータであれば正しく挙動してくれるのですが
store(d, 'Han Solo', 'Ahan Solo')のように複数のデータを入れようとすると'Ahan Solo'しか格納してくれません
なぜ'Han Solo', 'Aha~n Solo' 両方とも格納してくれないのか理解できません。
英雄の名前で遊んだのが原因でしょうか?
回答1件
あなたの回答
tips
プレビュー