何でリストの場合はリスト名をメソッドの引数に書いて、辞書の場合は辞書名をドットでつなぐ(オブジェクトにする?)のですか?
また、リスト名と辞書名は独立ではないのになぜメソッドを分けているのでしょうか?
enemies = ["スライム","ドラゴン","魔王"]
for i,enemy in enumerate(enemies):
print(i,enemy)
0 スライム
1 ドラゴン
2 魔王
enemies = {0:"スライム",1:"ドラゴン",2:"魔王"}
for i,enemy in enemies.items():
print(i,enemy)
0 スライム
1 ドラゴン
2 魔王
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
大前提として、
python
1enemies = ["スライム","ドラゴン","魔王"] 2for i,enemy in enumerate(enemies): 3 print(i,enemy) 4""" 50 スライム 61 ドラゴン 72 魔王 8""" 9 10enemies = {0:"スライム",1:"ドラゴン",2:"魔王"} 11for i,enemy in enemies.items(): 12 print(i,enemy) 13 14""" 150 スライム 161 ドラゴン 172 魔王 18"""
両者はまったく違う処理です。たまたまprintされる結果が同じというだけで。
{0:"スライム",1:"ドラゴン",2:"魔王"}
は{"a":"スライム","b":"ドラゴン","c":"魔王"}
にしても別に構わないが、リストの方はこれはできない、ということがわかれば、理解できると思います。リストはindexと値を対応付けるデータ構造で、辞書はキーと値が結びついたデータ構造です。
enumerate
は型としてはクラスで、enemies
はenumerate
のコンストラクタに渡されます。もしenumerate
がlist
のメソッドだと思っているのなら、間違いです。enumerate
はグローバル名前空間に束縛された組み込み型です(厳密にはもう少し複雑な仕組みなのですが、アバウトに言えばそうです)。
enemies.items()
は辞書のインスタンスに対するdict.items
の呼び出しです。
なので、両者はまったく別物だし、実は私などは見た瞬間「まったく違うコードだろう」と認識してしまうので、質問者様の疑問をあまりよく理解できていません。なので、もしかしたら的はずれなことを書いているかもしれませんが、ご容赦ください。
何でリストの場合はリスト名をメソッドの引数に書いて、辞書の場合は辞書名をドットでつなぐ(オブジェクトにする?)のですか?
上で書いたとおり、enumerate
はメソッドでもなんでもありません。辞書の場合、ドットでつなぐことでオブジェクトにしている訳でもありません。強いて言えばdict.items
というメソッドオブジェクトをcallしているだけです。
また、リスト名と辞書名は独立ではないのになぜメソッドを分けているのでしょうか?
いえ、両者は完全に独立したコードです。それぞれ別に動かしてもちゃんと動きます。
投稿2018/12/02 08:53
総合スコア30939
0
ベストアンサー
何でリストの場合はリスト名をメソッドの引数に書いて、辞書の場合は辞書名をドットでつなぐ(オブジェクトにする?)のですか?
『そういう設計だから』というと元も子もないですかね。
こんな関数も作れるわけですし。
Python
1def items(dct): 2 return dct.items()
ドキュメントでは、次のように説明されています。
Python にメソッドを使う機能 (list.index() 等) と関数を使う機能 (len(list) 等) があるのはなぜですか?
主な理由は歴史です。複数の型に対しての総称的な操作で、対象のオブジェクトがメソッドを全く持っていなかった (例えば、タプル) としても働くよう意図したものに関数は使われました。Python の関数的機能 (map() 、zip() など) を使うときに、型のはっきりしないオブジェクトのコレクションに対して、難なく適用できる関数があるのも便利なことです。
引用元: Python よくある質問 » デザインと歴史 FAQ
確かにenumerateの引数はイテラブルなら何でも良いですから、
リストのメソッドとして定義する必然性は無いのだ、と納得できます。
また、リスト名と辞書名は独立ではないのになぜメソッドを分けているのでしょうか?
enumerateは、start引数を指定すれば開始番号を自在に変更できます。
Python
1>>> enemies = ["スライム", "ドラゴン", "魔王"] 2>>> for i, enemy in enumerate(enemies, start=100): 3... print(i, enemy) 4... 5100 スライム 6101 ドラゴン 7102 魔王
また、引数がリストでなければいけないというわけでもありません。
Python
1>>> for i, ch in enumerate('spam'): 2... print(i, ch) 3... 40 s 51 p 62 a 73 m
dict.itemsがインデックスを含んだタプルを返すのは、
今回たまたまそのようなキーが用いられていたというだけです。
Python
1>>> enemies = {"弱": "スライム", "中": "ドラゴン", "強": "魔王"} 2>>> for k, enemy in enemies.items(): 3... print(k, enemy) 4... 5弱 スライム 6中 ドラゴン 7強 魔王 8>>> 9>>> for i, enemy in enumerate(enemies.values()): 10... print(i, enemy) 11... 120 スライム 131 ドラゴン 142 魔王
投稿2018/12/02 07:43
編集2018/12/02 09:01総合スコア35676
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/02 08:57

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。