質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

辞書の追加で追加場所を指定できるのかどうか

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,193

score 55

辞書の追加について理解したい

辞書に対していくつかのコードを書いて実行して無事エラーがなく出力できたのですが、'消しゴム'を追加した時に辞書の最後に自動的に追加されていることに少し疑問を持ちました。

リストではinsert()をつかって追加をする場所を指定できたのに、辞書ではそういうことができないのかと思い,公式サイトや入門pyhton3を調べてみても、そういった関数が見当たりません。
辞書で追加をする時は追加する場所を指定できないのでしょうか?

もし追加する場所を指定できなかったとしたらそれは、辞書で順番というのはリストほど大切な要因ではないから、順番を指定して入れる関数があったとしても、メリットがないから存在しないのかなと勝手に想像してみましたが、実務経験ゼロの初心者の考えなので、ご存知の方がいらっしゃったら回答していただけると幸いです。よろしくお願いします。

コード

stationery = {'色ペン': 22,
              'ノート': 31,
              'のり': 8,
              'えんぴつ': 24}

stationery['消しゴム'] = 10

stationery['えんぴつ'] = 20

del stationery['のり']

print(stationery)

結果

{'色ペン': 22, 'ノート': 31, 'えんぴつ': 20, '消しゴム': 10}

補足情報(FW/ツールのバージョンなど)

mac 10.14.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

もし追加する場所を指定できなかったとしたらそれは、辞書で順番というのはリストほど大切な要因ではないから、順番を指定して入れる関数があったとしても、メリットがないから存在しないのかなと勝手に想像してみました

良い推察だと思います。実際そのとおりです。

Python3.7以降では辞書への要素の挿入順が保証されるようになりましたが、
順序を任意順に入れ替えることは、全て取り出して再挿入しない限りできないように思います。

目的に依っては、そもそも辞書の利用が不向きなだけかもしれません。

  • 出力するとき、その場限りで順序を並び替えたい
    辞書を用い、順序は呼び出し側の責任で調整すると素直でしょう。
  • ある目的の順序に沿うように要素を格納していきたい
    ヒープを利用すると二分木を利用すると効率良く実装できるように思います。(※)
    辞書のように添え字アクセスを伴いたいのならば、クラスを自作する必要があるかもしれません。

※ JavaのTreeMapという任意順を保証するマップ構造は、二分木で実装されているようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 19:51

    回答ありがとうございます。
    説明を読んで理解できました。クラスの自作はこれからいつか学習していくと思うので、そのときにいろいろチャレンジしていこうと思います。
    モヤモヤが晴れました。ありがとうございました。

    キャンセル

+3

dictの要素には順番の概念はない、というのが伝統的なpythonの(というか多くの言語でそうですが)考え方です。

こういうものは内部的にはハッシュテーブルというアルゴリズムというかデータ構造で実装されているのですが、仕組み上何らかの特別な処置をしなければ順序は保証されません。

ただし、最近のpythonの実装(処理系依存の実装ではCPyhton3.6以降、言語仕様として確定したのは3.7以降)では順序を保証するようになっていますが、「n番目の要素を取り出す」といった処理は相変わらずサポートされていませんし、今後もされないと思います。

なので、

  • 辞書はキーで要素にアクセスするもの
  • 順番はないものとみなして処理する

と覚えておけば良いです。

ハッシュテーブル - Wikipedia | 全要素の列挙

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 19:52

    回答ありがとうございます。
    辞書はキーに重複がないようにと強調していたので、確かに順番は関係ないですよね。
    理解が深まりました、ありがとうございました。

    キャンセル

  • 2019/01/17 19:53

    サイトも読ませていただきます。ありがとうございました。

    キャンセル

+1

参考情報

...
任意の位置に新たな要素を追加
任意の位置に新たな要素を追加したOrderedDictオブジェクトを新たに作成することができる。

items()メソッドで取得できるビューオブジェクト をlist()でリスト化
リストのinsert()メソッドでキーと値のペアのタプル(key, value)を追加
コンストラクタcollections.OrderedDict()に渡し、新たなオブジェクトを作成
という流れ。
...

dict の要素の順番の保持をしたいという要求があるから、
OrderedDict があったり、3.7から言語仕様で順番を保持するようになったのでしょう。

上に紹介したページでは
・ 要素を先頭・末尾に移動
・ 任意の位置に新たな要素を追加
・ 要素を入れ替え(並べ替え)
・ 要素をキーまたは値でソート
といった操作も説明されています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 12:30

    回答ありがとうございます。
    ページを読みましたが、順序つき辞書についてわかりやすく説明されており、とても勉強になりました。
    勉強のため、少し自分でコードを作ってみようと思います。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る