パソコン仕事5倍塾
35,000人を指導した東大卒・元日本IBM社内講師が直伝
MENU
jinoseさんの投稿
(投稿ID: 5538)
小川 慶一さんのコメント
(コメントID: 8355)
my_dict = { 'id': 5, 'name': '高橋', 'score': 80 } print('my_dict のキーを表示します') for key in my_dict.keys(): print(key)
my_dict のキーを表示します id name score
print('my_dict のキーの型を調べます') print(type(my_dict.keys()))
my_dict のキーの型を調べます <class 'dict_keys'>
Captcha:
たった1ヶ月で人生が劇的に変わりました
佐藤信さん
役員クラスの方から高い評価を受けるようになりました。
佐賀県 - 岩本徹さん
今までまったく知らなかったショートカットキーを使いまくっています。
東京都 - 鷹觜慶さん
年齢60才間近、営業で外回りの時間が多い私でも退社時間が1-2時間程度早くなりました。
東京都 - 宗内隆明さん
受講前もすでにパソコン得意でしたが、そんな私でも受講して本当に良かったと思えた講座です。
東京都 - 佐伯とも子さん
ここまで包括的に仕事に役立つ深い学びを受けれた講座は初めてでした
東京都 - 飯田倫子さん
2024年12月15日 22:47
2024年12月14日 06:16
2024年12月02日 10:35
2024年11月30日 11:04
2024年11月27日 09:59
2024年12月17日 07:25
2024年12月17日 05:44
2024年12月16日 10:51
2024年12月16日 10:02
2022年02月24日 10:59
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
2022年02月02日 00:00
2022年02月02日 03:00
2022年02月02日 06:00
2022年02月02日 09:00
2022年02月02日 12:00
2024年12月18日 13:30
2024年10月21日 17:30
2024年10月18日 17:00
2024年10月17日 17:30
2024年10月18日 16:45
2024年11月27日 11:48
2024年11月25日 12:07
2024年11月17日 09:51
2024年11月15日 16:41
2024年11月15日 13:07
jinoseさんの投稿
(投稿ID: 5538)
以下コードを書いた際、
for key in fish_dict.keys():
print(key)
出力結果
karei
katsuo
fugu
と表示されます。その為、
print(fish_dict.keys())と書いた際には、
['karei', 'katsuo', 'fugu']と、
Keyのみが出力されると思いました。
しかし出力結果は、
dict_keys(['karei', 'katsuo', 'fugu'])
でした。
dict_keys←この変数を作った覚えは無いのにこれが表示されるので、混乱しています。dict_keysは何を表すのでしょうか?
質問の意図が自分でもよく分からないのですが、何となく腑に落ちず質問させていただきました。
小川 慶一さんのコメント
(コメントID: 8355)
まず、53秒までに説明しているとおりで、 .keys() メソッドは、辞書の key を順番に取り出すためのメソッドです。
for 文の in 演算子以降に置くと、以下のように、順番に key を取り出してくれます。
出力結果:
ところで、この .keys() で得られるものは何なのか?
「そりゃ、リストとかタプルとかでしょ?」と思われるかもしれませんが...。
実は、違います。
my_dict.keys() で得られるものは何か?
以下の検査で分かります。
出力結果:
上記のとおり、「dict_keys クラスのオブジェクト」です。
type関数については、以下の「データモデル」講座で紹介しています。
Pythonのデータモデル - 撮り下ろし版
https://forum.pc5bai.com/lesson/course/116/
この「dict_keys クラスのオブジェクト」はリストやタプルとは何が違うのかというと...。
「for 文の in 演算子の後ろに置かれると、くりかえしの都度、辞書のキーを順番に返すオブジェクト」です。
要は、「リスト」や「タプル」のような「もう生成済の配列」ではなく、「for 文内では『リスト』や『タプル』のようにくりかえし対象として使えるけど、『生成済の配列』」ではない。
上記の点がミソです。
「もう生成済の配列」より、ちょっと抽象度が高いですね...。
なぜ、そんなものがあるのか?
話しだすとかなりまとまった話になってしまうので...ここでは簡単にメリットだけ書きますと。
今は辞書のキーが3件しかないですけど、極端な例として「キーが3,000万件ある辞書」などを考えてみてください。
そのとき、 .keys() メソッドを実行するつど、「要素が3,000万件あるリストを作る」とか、いかにも効率悪そうですよね。
生成に時間がかかるし、メモリも食います。
しかも、その全部を使うかどうかもわからない(for ループを「一定条件を満たしたら即離脱」なんていう構文もちょこちょこありますから)
なので、そんな無駄を省くために、「くりかえしの都度、辞書のキーを順番に返すオブジェクト」たる「dict_keys クラスのオブジェクト」というものが辞書にはあらかじめ備わっています。
この「dict_keys クラスのオブジェクト」は、イメージとしては、「すでにある辞書のキーを、要請がある都度、順番に渡してくれるという機能を持ったロボット」のようなものです。
まるっと言うと、 .keys() メソッドで「その辞書が有するロボットを呼び出した」というわけです。