0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python 辞書について

Posted at

昨日、今日始めた人レベルの悩み

東大が出してる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

無事解決しました!関数とかすぐ忘れちゃうからその都度確認した方がいいですね。
記事に起こすことで改めて理解が深まった気がします笑

以上

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?