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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

11293閲覧

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

gunmed

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/01/17 10:22

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

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

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

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

###コード

stationery = {'色ペン': 22, 'ノート': 31, 'のり': 8, 'えんぴつ': 24} stationery['消しゴム'] = 10 stationery['えんぴつ'] = 20 del stationery['のり'] print(stationery)

###結果

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

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

mac 10.14.1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

なので、

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

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

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

投稿2019/01/17 10:46

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/17 10:52

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

2019/01/17 10:53

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

0

ベストアンサー

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

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

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

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

  • 出力するとき、その場限りで順序を並び替えたい

辞書を用い、順序は呼び出し側の責任で調整すると素直でしょう。

  • ある目的の順序に沿うように要素を格納していきたい

ヒープを利用すると二分木を利用すると効率良く実装できるように思います。(※)
辞書のように添え字アクセスを伴いたいのならば、クラスを自作する必要があるかもしれません。

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

投稿2019/01/17 10:32

編集2019/01/17 10:56
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/17 10:51

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

0

参考情報

  • Pythonの順序付き辞書OrderedDictの使い方

https://note.nkmk.me/python-collections-ordereddict/

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

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

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

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

投稿2019/01/17 21:31

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/18 03:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問