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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1226閲覧

ある辞書から別の辞書に対応するキーの要素を代入する

tanshoko

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/14 15:30

タイトルが少し分かりづらいですが、

python

1dict_A = {"a": 0, "b": 0, "c": 0,"d": 0,"e": 0,"f": 0} 2dict_B = {"c": 10, "f": 15}

上のような辞書があったとき、

python

1new_dict_A = {"a": 0, "b": 0, "c": 10,"d": 0,"e": 0,"f": 15}

上のようにdict_Aと同じキーに対応する場所にdict_Bの要素を代入し、new_dict_Aを作成したいです。
for文を使えばできるのですが、計算時間がかかってしまうので、出来るだけ計算コストを抑えた方法がありましたら教えていただきたいです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

後から追加した要素が優先されるので、これで充分です。

Python

1>>> dict_A = {"a": 0, "b": 0, "c": 0,"d": 0,"e": 0,"f": 0} 2>>> dict_B = {"c": 10, "f": 15} 3>>> 4>>> new_dict_A = {**dict_A, **dict_B} 5>>> new_dict_A 6{'a': 0, 'b': 0, 'c': 10, 'd': 0, 'e': 0, 'f': 15}

ただし破壊的な方法でも良いならdict.updateの方が早そうです。

投稿2019/07/14 21:24

編集2019/07/14 21:26
LouiS0616

総合スコア35660

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

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

hayataka2049

2019/07/14 22:38

この辺の仕様って明文化されているのでしょうか……ドキュメントにすら書いてない実装依存とかだと嫌だなぁ、と
LouiS0616

2019/07/14 22:59 編集

> 6.2.7. 辞書表示 > キーとデータからなる対の並びがカンマ区切りで与えられたときは、その要素は左から右へ評価され、辞書のエントリーを定義します。すなわち、それぞれのキーオブジェクトが、辞書内で対応するデータを保存するキーとして使われます。 これにより、キーとデータのリストの中で同じキーを複数回指定することができ、そのキーに対する最終的な辞書の値は、最後に与えられたものになります。 > ダブルアスタリスク ** は 辞書のアンパック を表します。このとき被演算子は mapping でなければなりません。それぞれのmappingの要素は、新たな辞書に追加されます。キー/データの対もしくは辞書のアンパックによって先に追加された値は、後から追加された値によって上書きされます。 https://docs.python.org/ja/3/reference/expressions.html#dict --- > In dictionaries, later values will always override earlier ones https://www.python.org/dev/peps/pep-0448/
hayataka2049

2019/07/14 22:59

ありがとうございます。納得しました。
guest

0

dict.updateが使えますが、単純に使うとin-placeで処理されて元の辞書が変更されるので、必要に応じてcopyすると良いと思います。

python

1dict_A = {"a": 0, "b": 0, "c": 0,"d": 0,"e": 0,"f": 0} 2dict_B = {"c": 10, "f": 15} 3 4new_dict_A = dict_A.copy() 5new_dict_A.update(dict_B) 6print(dict_A) 7print(new_dict_A) 8""" => 9{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0} 10{'a': 0, 'b': 0, 'c': 10, 'd': 0, 'e': 0, 'f': 15} 11"""

で、要素数にもよりますが、ループで書いてもそんなに遅くはないかと。

python

1import timeit 2 3dict_A = {"a": 0, "b": 0, "c": 0,"d": 0,"e": 0,"f": 0} 4dict_B = {"c": 10, "f": 15} 5 6def f1(): 7 new_dict_A = dict_A.copy() 8 for k, v in dict_B.items(): 9 new_dict_A[k] = v 10 return new_dict_A 11 12def f2(): 13 new_dict_A = dict_A.copy() 14 new_dict_A.update(dict_B) 15 return new_dict_A 16 17print(timeit.timeit(f1)) # => 0.5886494450096507 18print(timeit.timeit(f2)) # => 0.46052658899861854 19

元々ない要素は更新しないとか、柔軟なことをやりたければループの方が向いているかもしれません。

投稿2019/07/14 17:28

hayataka2049

総合スコア30933

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

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

0

(きっちりと実装を読んでないのですが) updateメソッドを使えば効率的に実行できます。

python

1dict_A.update(dict_B) 2 3print(dict_A) # {'a': 0, 'b': 0, 'c': 10, 'd': 0, 'e': 0, 'f': 15}

jupyter notebookで評価した結果をつけておきます。
https://gist.github.com/yuokada/e7cc0a9b0552079e5bdb1ae9c2446ab4

投稿2019/07/14 16:15

編集2019/07/14 16:38
yuokada

総合スコア550

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

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

0

updateで更新できます。これで良かったでしょうか?

dict_A = {"a":0,"b":0,"c":0,"d":0,"e":0,"f":0} dict_B = {"c":10,"f":15} dict_A.update(dict_B) print(dict_A)

投稿2019/07/14 16:15

bamboo-nova

総合スコア1408

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問