nba_players_dict={
1: {'name':'Michel','points':32292,'nickname':'Black Jesus'},
2: {'name':'Kobe','points':33643,'nickname':'Black Manba'},
3: {'name':'Lebron','points':38000,'nickname':'King'},
}
for key in nba_players_dict.keys():
print(key) # 1,2,3が出力されるはず←合ってた
for value in nba_players_dict.values():
print(value) # {'name':'Michel','points':32292,'nickname':'Black Jesus'}...が出力のはず←合ってた
for item in nba_players_dict.items():
print(item) # 1:{'name':'Michel','points':32292,'nickname':'Black Jesus'}...が出力のはず ← 間違い。タプルだった...
for key, value in nba_players_dict.items():
print(key,value) #キー(数値)と値({...})が出力されるはず←合ってた。
jinoseさんの投稿
(投稿ID: 5551)
まず、既出のfish_dictについてですが、
この場合、
'karei'等の文字列がkey、
15等の数値がvalue、
'karei':15 等の , で区切られた部分が要素、
インデックス番号は左から0、1、2
という理解でよろしいでしょうか?
そして、keys()メソッド?を使った場合、
print(fish_dict.keys())のConsoleの出力結果は
となり、
の出力結果は
となります。
なぜ前者は dict_keys(['karei', 'katsuo', 'fugu'])のように、dict_keysという文字や()や[]や'karei'等と出力されるのに、後者(for文の中に変数を用意したら、自動的にfish_dictのkeyの部分(valueではなく)が代入される)は
karei
katsuo
fugu
とだけ出力されるのでしょうか?
次に、一部抜粋の
について、
keyは1、コロンより後ろの {'name':'山羊座', 'month':1, 'day':19} はそれぞれなんと呼べばよいのでしょうか・・・?
以下Copilotからの回答ですが、よく分かりませんでした。。。
keys() メソッドは、辞書オブジェクトのキーを取得するためのメソッドです。このメソッドは dict_keys クラスを返します。dict_keys はキーのリストのようなもので、リストとは異なる特殊なデータ型です。そのため、dict_keys(['karei', 'katsuo', 'fugu']) のように出力されます。この dict_keys は直接リストとして使えないため、必要な場合は list() 関数を使ってリストに変換することができます。
一方、for key in fish_dict: のような for ループは、辞書のキーを直接取得します。この場合、key には辞書の各キーが自動的に代入されます。したがって、karei、katsuo、fugu のようにキーの値が直接出力されます。
次に、一部抜粋の base_dic = {1: {'name':'山羊座', 'month':1, 'day':19}} についてです。この辞書では、キー 1 に対応する値は {'name':'山羊座', 'month':1, 'day':19} です。この値は別の辞書を表しており、キーと値のペアを持っています。この場合、{'name':'山羊座', 'month':1, 'day':19} の部分は「辞書の値」または「アイテム」と呼ばれます。
小川 慶一さんのコメント
(コメントID: 8392)
順番に整理していきましょう (^^;
リストでは、「要素」という言葉があります。
また、要素をインデックス番号で取り出せます。
例:
辞書では「要素」という言葉は使いません。
また、「インデックス番号でなんとか...」といったこともできません。
まず、ここまでいかがですか。
>'karei':15 等の , で区切られた部分が要素、
「要素」ではなく、「キーと値のペア」または「アイテム(item)」と呼ばれます。
>インデックス番号は左から0、1、2
前述のとおり、辞書で「インデックス番号」はありません。
ここまで理解できたかできてないか教えてください。
あと、このタイミングで、改めて自分でサンプルコードをいろいろ書いて試されることをおすすめします。
小川 慶一さんのコメント
(コメントID: 8395)
土台が70%で次も70%だと、理解度は70% x 70% -> 49% になってしまう。
そこにもうひとつ 70% がかかると 35% になってしまう。
そんな世界です。
「分かったようなつもり」が積み上がると、すぐに、「分かっているつもりが、何も分からない」といった状態になってしまいます。
> 改めて自分でサンプルコードをいろいろ書いて試されることをおすすめします。
こういう活動は、「70%」を「85%」とか「90%」とかにするのにとても有効です。
今回「そして、keys()メソッド?を使った場合、...」、「なぜ前者は ...」というところまで話をできないのは、 70% x 70% x 70% で 35% になっていることについての話になってしまうからです。
これはもう、最初の 70% をいったん 90% とかそういうところに引き上げるしかありません。そのためには、さらに自分で手を動かしながら理解を深めることです。
こういうところはIT系のスキルを学ぶときの初心者にとって都合の悪い点ですが...逆に、いったんスキルが身について、そういう学習習慣が身についてしまえば、こういうところが、非IT系の人をを寄せ付けない参入障壁でもあります。
jinoseさんは、ちょうど今、その分水嶺くらいにいるかな...と感じます。
jinoseさんのコメント
(コメントID: 8398)
>ここまで理解できたかできてないか教えてください。
以下の認識で大丈夫であれば、理解できたと思います。
キー → 1
値→ {'name':'山羊座', 'month':1, 'day':19}
のペアとなっている。更に、{'name':'山羊座', 'month':1, 'day':19} の中で、それぞれ
キー → 'name'
値 → '山羊座'
キー → 'month'
値 → 1
キー → 'day'
値 → 19
のペアとなっている。
>あと、このタイミングで、改めて自分でサンプルコードをいろいろ書いて試されることをおすすめします。
頂いた野球選手の辞書を基に、自分の好きなNBA選手の名前や得点の辞書を作成しました。
>jinoseさんは、ちょうど今、その分水嶺くらいにいるかな...と感じます。
分水嶺超えられる用に励みます!
小川 慶一さんのコメント
(コメントID: 8399)
では、続きです。
これからする話のオチは、以下のものです。
1. print関数は、「文字列表現」を出力する関数です。
2. 辞書は、 for 文の in の後に置くと、その key を順番に返します。
というだけのことです。
これらは別々の事象なので、以下の質問に真正面から答えるとすると
>なぜ前者は dict_keys(['karei', 'katsuo', 'fugu'])のように、dict_keysという文字や()や[]や'karei'等と出力されるのに、後者(for文の中に変数を用意したら、自動的にfish_dictのkeyの部分(valueではなく)が代入される)は
>
>karei
>katsuo
>fugu
>
>とだけ出力されるのでしょうか?
「前者は1.によりそういう仕様で、後者は2.によりそういう仕様だから」というところでしょうか。
1. 2. はそれぞれ独立した現象です。関連性はありません。「前者はこうだから後者はああなるだろう」とか「後者はああだから前者はこうなるだろう」と期待できるものではありません。
...ということで、以下、このオチに向けて(途中脱線もしますが)話をしていきます。
- - -
[[part1]]
まずは、以下について。
のConsoleの出力結果は
となります。
これは、print関数では、オブジェクトの「文字列表現」が出力されるからです。
print関数は、オブジェクトの「文字列表現」を出力する関数です。
↑
これ、重要です。しっかり覚えておいてください。
初見では意味が分からなくても、とりあえずこのまま読み進めて。そのあと、もう一度最初から読み返して、そのときにでいいので覚えてください。覚えきれなかったら、自分で演習して、もういちど読み返して、とにかく、最終的には「ああ、なるほどね。しっくりきた」というところまでもっていってください。
ここで、「文字列表現とは何か?」というと...。
簡単にいうと、「オブジェクトを、文字列で表現したもの」です。
なんのこっちゃ。
たとえば「大谷翔平」という文字列は、実在する野球選手(オブジェクトです)の文字列表現です。
「大谷翔平」という文字列は、あの有名な野球選手そのものではないですね。あくまで、その象徴の文字列です。
もし Python の変数に大谷翔平という野球選手そのもの(オブジェクトです)を入れることができたならば...。
そして、仮にその変数を baseball_player とするならば。
とすると、「大谷翔平」という文字列が出力されることが期待できます(*1)。
実在の大谷翔平そのものを二次元の画面に出力することはできません。
そのかわり、「『大谷翔平』という文字列を出力して、まあ、いちおう満足しましょう」ということです。
ためしに、新聞とかネットニュースとかを適当に見つけて、そんなつもりで読んでみてください。
様々なオブジェクトを、無理やり文字列として表現していますね。
新聞の紙に本物のオブジェクトを差し込むなんてできないので、新聞記者は、苦肉の策として様々なオブジェクトの象徴たる文字列を並べ、その関係によって情報を伝えているわけです。
たとえば、以下の記事タイトル。どれだけのオブジェクトの象徴が含められているでしょう...。
パイレーツの剛腕、スキーンズ、大谷翔平との対戦へ「良い投球をして仕留めないといけない」
「スティーブ・ジョブス」でも、「神奈川県横浜市」、「夜店」、「鰹節」、「冷蔵庫」、「耕運機」、「ハンマー投げ」、「バスケットボール」でも、何でもそうです。
「ThinkPad」でも「腕時計」でもそう。
実体としてはオブジェクトがある。print関数で出力しようとなったら、(オブジェクトそのものを平面のモニターに文字列として出力することは無理なので)それを象徴する文字列を出力する。
print関数はそういうことをしてくれます。
冗談抜きで、こういう視点で世界を見ることはとても大切です。
リアルの仕事を Python で効率化できるようになるには、「ああ、この仕事は、Pythonでやるならこんな感じだな」と見当をつけられるようになる必要があります。
それには、Python的な視点で世界を見る訓練が必要です。
ここまで、どうでしょうか。
- - -
[[part2]]
さて、で。
の keys() メソッドは、何らかのオブジェクトを返すわけですが、その返されたオブジェクトを print してみると(つまり、無理やり文字列として表現してみると)
と表現できるということです。
以下、ついでにいろいろ見てみましょう。
(辞書については、 keys, values, items はセットで覚えたいところです)
参考: 以下の講座で、 id, 型, 値という話をしました。
Pythonのデータモデル - 撮り下ろし版
https://forum.pc5bai.com/lesson/course/116/
ということで、ついでに型も見てみますか。
fish_dict はオブジェクト。
type(fish_dict) もオブジェクト。
print(type(fish_dict)) は、オブジェクトたる type(fish_dict) を無理やり文字列として表現しています。
ここまで、大丈夫ですかね。
ひとつひとつの部品を丁寧に観察して挙動を追っていく必要があります。
- - -
[[part3]]
さて、次に。
について。
fish_dict は、 for 文の in の後に置くと、その key を順番に返します(*2)。
なので、
という出力結果が得られるわけです。
この for 文での挙動についての話は、これで終わりです。
これ以上でもこれ以下でもありません。
- - -
[[part4]]
ということで...まとめです。
整理すると:
1. print関数は、「文字列表現」を出力する関数です。
2. 辞書は、 for 文の in の後に置くと、その key を順番に返します。
というだけのことです。
これらは別々の事象なので、以下の質問に真正面から答えるとすると
>なぜ前者は dict_keys(['karei', 'katsuo', 'fugu'])のように、dict_keysという文字や()や[]や'karei'等と出力されるのに、後者(for文の中に変数を用意したら、自動的にfish_dictのkeyの部分(valueではなく)が代入される)は
>
>karei
>katsuo
>fugu
>
>とだけ出力されるのでしょうか?
「前者は1.によりそういう仕様で、後者は2.によりそういう仕様だから」というところでしょうか。
1. 2. はそれぞれ独立した現象です。関連性はありません。「前者はこうだから後者はああなるだろう」とか「後者はああだから前者はこうなるだろう」と期待できるものではありません。
...と、ここまでいかがでしょうか。
- - -
part1, part2, part3, part4 と分割して説明してきました。
量が多いですが、個別に対処していってください。
追記:
(*1)
とすると、「大谷翔平」という文字列が出力されることが期待できると書きましたが、実際は、どういう文字列が出力されるかは、そのオブジェクトの __str__ メソッドで定義されていることです。
__str__ メソッドの説明は、以下の講座までおあずけです。
さらっと学ぶ、Python基礎文法 - section3
https://forum.pc5bai.com/lesson/course/106/
(*2)
「for 文の in の後に置くと、その key を順番に返します」というのは、 Python 3.7 以降の実装です。
実は、3.6までは、 keys() は、キーと値のペアを追加した順番に得られるというはっきりとした保証はありませんでした。
今日ではこの件を気にする必要はありませんが、ネットで古い記事を見るときなどは要注意です。
jinoseさんのコメント
(コメントID: 8400)
>2. 辞書は、 for 文の in の後に置くと、その key を順番に返します。
こちらの内容は、おそらくですが理解できました。そういう仕様なのですね。
問題は1.の方です^^;
>1. print関数は、「文字列表現」を出力する関数です。print関数は、オブジェクトの「文字列表現」を出力する関数です。
>↑
>これ、重要です。しっかり覚えておいてください。
>初見では意味が分からなくても、とりあえずこのまま読み進めて。そのあと、もう一度最初から読み返して、そのときにでいい>ので覚えてください。覚えきれなかったら、自分で演習して、もういちど読み返して、とにかく、最終的には「ああ、なるほど>ね。しっくりきた」というところまでもっていってください。
>ここで、「文字列表現とは何か?」というと...。
>簡単にいうと、「オブジェクトを、文字列で表現したもの」です。
>なんのこっちゃ。
>たとえば「大谷翔平」という文字列は、実在する野球選手(オブジェクトです)の文字列表現です。
>「大谷翔平」という文字列は、あの有名な野球選手そのものではないですね。あくまで、その象徴の文字列です。
こちらについては、何となく、分かりかけてきたような・・・気がします(理解度30%ほど??)。
確かに、「大谷翔平」というオブジェクト(人間、名前、男性、二刀流、右投げ、左打ち、身長193cm、体重95Kg、投げる、走る、打つ、等など、、、(ここで、「全体は部分の総和ではない」という先生のメルマガの一節が頭に思い浮かびましたが) )をコードに書き起こしたところで、現実の大谷選手がポンッ!と出現するわけも無く。
print()関数によって「大谷翔平」という文字列が出力された。というのが「オブジェクトを、文字列で表現したもの」なのだろうか・・・?
というような感じです。
これ以上考え込んだら沼にはまりそうそうなので、一旦先に進み、ちょくちょく戻るようにします^^;
改めて、ありがとうございました!!!
小川 慶一さんのコメント
(コメントID: 8403)
>というような感じです。
>これ以上考え込んだら沼にはまりそうそうなので
ひと晩経って、どうでしょうか。
一連のご質問について整理すると...。
以下の [A] を前提として [B] の質問をされたわけですが、そもそも [A} が間違っていたわけです。
[A}
まず、既出のfish_dictについてですが、
fish_dict = {'karei':15,'katsuo':25,'fugu':100}
この場合、
'karei'等の文字列がkey、
15等の数値がvalue、
'karei':15 等の , で区切られた部分が要素、
インデックス番号は左から0、1、2
という理解でよろしいでしょうか?
[B]
そして、keys()メソッド?を使った場合、
- - -
[A} を前提として AIに [B] について聞いても要領を得ない回答がきてしまうのは仕方ないです。
そもそも、 [A] について聞くべきだったと思います。
(「初心者にもわかりやすいよう、例を示しなから説明してください」と書き添えると良いです)
あと、[A] についての自分の理解が正しいかどうかを確かめるべく、テストをいろいろ書いてみることですね。
jinoseさんのコメント
(コメントID: 8404)
>以下の [A] を前提として [B] の質問をされたわけですが、そもそも [A} が間違っていたわけです。
上記、理解できたと思います。ありがとうございます。2晩経って、頭の中が整理されてきた感じがあります。
[A] を前提として [B] の質問をしたのは、私が「変数のkeyと、keyと値のペアのkeyと、.keys()メソッドに3つのkeyという単語がある為、[A]と[B]それぞれ関連があると思いこんだ」結果だと思います。
小川 慶一さんのコメント
(コメントID: 8405)
なんども復習してください。
復習時は、動画の再生速度を上げても良いと思います。
必要に応じて、速度を下げたり、なんども聞き直したり、テキストお越ししたりされると良いです。
あとは、とにかくいろいろ自分でコードを書いてみて、テストして...と繰り返すことです。
質の高い行動の量がそのまま結果につながります。