昨日、今日始めた人レベルの悩み
東大が出してるPythonプログラミング入門なる資料で学習を進めていて辞書(dictionary)で頭がこんがらがってきたので自分の記録として残します。
9.1 練習
リスト list1 が引数として与えられたとき、list1 の各要素 value をキー、value の list1 におけるインデックスをキーに対応する値とした辞書を返す関数 reverse_lookup を作成してください。
以下のセルの ... のところを書き換えて reverse_lookup(list1) を作成してください。
まず問題文からして何を言ってるのか読み解くのに暫く時間がかかる感じでしたが要するに引数list1の要素をキーにして、値を対応するキーにして返す関数を作ってねってことでした。多分言ってることと書いてること同じですが初見だと悩みました。
リスト?タプル?辞書?な自分が最初に書いたコード
for value in list1:
fruits = value,reverse_lookup[0::1]
return fruits
結果:
print(reverse_lookup(['apple', 'pen', 'orange']) == {'apple': 0, 'orange': 2, 'pen':1})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-f122f1f91ede> in <cell line: 1>()
----> 1 print(reverse_lookup(['apple', 'pen', 'orange']) == {'apple': 0, 'orange': 2, 'pen':1})
<ipython-input-20-ee2800cc7bb7> in reverse_lookup(list1)
1 def reverse_lookup(list1):
2 for value in list1:
----> 3 fruits = value,reverse_lookup[0::1]
4 return fruits
TypeError: 'function' object is not subscriptable
見返すと訳わかんないコード書いてますがChatGPT様曰く
問題点
reverse_lookup に対するスライス操作 reverse_lookup[0::1]:
reverse_lookup は関数であり、リストではありません。そのためスライス操作([0::1])は適用できず、TypeError: 'function' object is not subscriptable が発生します。
fruits の定義:
value, reverse_lookup[0::1] という形式でリストの値とインデックスを組み合わせていますが、これは意図した結果になりません。
辞書の作成方法:
辞書を作成するためには、キーと値のペアを管理する必要がありますが、その処理が欠けています。
つまりスライスは文字列やリストに使えるよ!でも自分は関数に対して使ってるからダメ。
そもそも辞書の作り方すら間違ってるよ!ってことでした。
解決策
辞書を作るにはからの辞書をまず作る
fruits = {}
enumerate()関数を使う(以下資料からコピペ)
Python では enumerate() 関数が用意されており、上のプログラムは以下のように書き換えることができます。
for i, val in enumerate(some_list):
繰り返させたい処理
2 つの変数 i, val が指定されています。 i には 0, 1, 2, … が順に代入されます。 val にはリストの要素が
順に代入されます。
これを踏まえて
def reverse_lookup(list1):
fruits = {}
for index, value in enumerate(list1):
fruits[value] = index
return fruits
print(reverse_lookup(['apple', 'pen', 'orange']) == {'apple': 0, 'orange': 2, 'pen':1})
True
無事解決しました!関数とかすぐ忘れちゃうからその都度確認した方がいいですね。
記事に起こすことで改めて理解が深まった気がします笑