辞書に新しいキーを追加するにはどうすればよいですか?


2622

作成後にPython辞書にキーを追加することはできますか?

.add()メソッドがないようです。


25
ここにキーを追加して新しい辞書返す方法を見つけようとしている場合、これをpython3.5 +:で行うことができます。{**mydict, 'new_key': new_val}
cs95 2018

受け入れられた回答を使用する:d ['mynewkey'] = 'mynewvalue'またはval = d.setdefault( 'mynewkey'、 'mynewvalue')
Ol 'Dawg

回答:


3403
d = {'key': 'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'key': 'value', 'mynewkey': 'mynewvalue'}

108
説明は次のとおりです。そのキーに値を割り当てることにより、ディクショナリに新しいキーと値のペアを作成します。キーが存在しない場合は追加され、その値を指します。存在する場合、それが指す現在の値は上書きされます。
R. Navega

9
これと.update()方法の違いは何ですか?どちらが良いですか?
hegash

14
@hegashは、d[key]=val構文が短く、任意のオブジェクトをキーとして(ハッシュ可能である限り)処理できるため、1つの値のみを設定しますが、.update(key1=val1, key2=val2)複数の値を同時に設定する場合は、文字列です(kwargsは文字列に変換されるため)。dict.update別の辞書を使用することもできますが、個人的には、別の辞書を更新するために新しい辞書を明示的に作成しないことを好みます。
bgusach

試してみてください、ここに例があります:repl.it/@SmaMa/Add-key-to-dict
Sma Ma

ネストされたdictに要素を追加するにはどうすればよいですか。$foo[ ] = [ . . . . ]
PHPの

1043

複数のキーを同時に追加するには、次を使用しますdict.update()

>>> x = {1:2}
>>> print(x)
{1: 2}

>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print(x)
{1: 2, 3: 4, 5: 6, 7: 8}

単一のキーを追加する場合、受け入れられた回答の計算オーバーヘッドは少なくなります。


13
これは、1つのキーを更新するためだけに辞書を作成するのは非効率的です。これを行うあなたは(それが辞書を作成する方が良いでしょうそれより上のしきい値があるかもしれない)1つの以上の鍵を持っている場合にのみ
ジャン=フランソワ・ファーブル

10
@Jean-FrançoisFabreこれはサンプルコードです。答えをすべてのケースをカバーするものとして扱うべきではありません。
Robert Brisita

1
1つのキーを追加するための好ましい方法であるという誤った印象を与えます。
ジャン=フランソワ・ファーブル

@Jean-FrançoisFabredictの順序付けはPython 3.7+(および3.6+で提供)保証されているため順序が重要な場合にこれが単一のキーを追加するための推奨される方法です。
1

あなたx[-1] = 44-1値のような別のキーを作成する場合も最後にあります。とにかく答えは編集されており、今はずっと良くなっています。辞書に多くのアイテムが含まれている可能性がある場合は、辞書で更新することをお勧めします。
ジャン=フランソワ・ファーブル

929

Python辞書に関する情報を統合したいと思います。

空の辞書を作成する

data = {}
# OR
data = dict()

初期値を持つ辞書を作成する

data = {'a': 1, 'b': 2, 'c': 3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1), ('b',2), ('c',3))}

単一の値の挿入/更新

data['a'] = 1  # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a': 1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)

複数の値の挿入/更新

data.update({'c':3,'d':4})  # Updates 'c' and adds 'd'

オリジナルを変更せずにマージされた辞書を作成する

data3 = {}
data3.update(data)  # Modifies data3, not data
data3.update(data2)  # Modifies data3, not data2

辞書の項目を削除する

del data[key]  # Removes specific element in a dictionary
data.pop(key)  # Removes the key & returns the value
data.clear()  # Clears entire dictionary

キーがすでに辞書にあるかどうかを確認する

key in data

辞書のペアを反復する

for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys

2つのリストから辞書を作成する

data = dict(zip(list_with_keys, list_with_values))

Python 3.5の新機能

オリジナルを変更せずにマージされた辞書を作成する:

これは、辞書アンパックと呼ばれる新しい機能を使用します。

data = {**data1, **data2, **data3}

Python 3.9の新機能

既存の辞書の値を更新または追加する

更新作業は |=今の辞書のために動作します:

data |= {'c':3,'d':4}

オリジナルを変更せずにマージされた辞書を作成する

マージオペレータは、 |今の辞書のために動作します:

data = data1 | {'c':3,'d':4}

さらに追加してください!


145

「作成後にPython辞書にキーを追加することはできますか?.add()メソッドがないようです。」

はい、可能です。これを実装するメソッドはありますが、直接使用する必要はありません。

それを使用する方法と使用しない方法を示すために、dictリテラルを使用して空のdictを作成します{}

my_dict = {}

ベストプラクティス1:下付き表記

この辞書を単一の新しいキーと値で更新するには、項目の割り当てを提供する添え字表記(ここでのマッピングを参照)を使用できます。

my_dict['new key'] = 'new value'

my_dict 今でしょ:

{'new key': 'new value'}

ベストプラクティス2:updateメソッド-2つの方法

またupdateメソッドを使用して効率的に複数の値でdictを更新することもできます。ここでは不要に追加を作成している可能性があるdictため、dictすでに作成されており、別の目的で使用または使用されていることを願っています。

my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})

my_dict 今でしょ:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}

updateメソッドでこれを行う別の効率的な方法は、キーワード引数を使用することですが、それらは正当なpython単語である必要があるため、スペースや特殊記号を使用したり、名前を数字で始めることはできませんが、多くの人がこれをより読みやすい方法と考えています辞書のキーを作成するために、そしてここで私たちは確かに余分な不要なものを作成することを避けますdict

my_dict.update(foo='bar', foo2='baz')

そしてmy_dict今:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value', 
 'foo': 'bar', 'foo2': 'baz'}

これで、を更新する3つのPythonの方法について説明しましたdict


魔法の方法、、__setitem__そしてなぜそれを避けるべきか

メソッドdictを使用する、使用すべきでないを更新する別の方法があります__setitem__。この__setitem__メソッドを使用してキーと値のペアをに追加する方法の例dictと、それを使用した場合のパフォーマンスの低下を示します。

>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}


>>> def f():
...     d = {}
...     for i in xrange(100):
...         d['foo'] = i
... 
>>> def g():
...     d = {}
...     for i in xrange(100):
...         d.__setitem__('foo', i)
... 
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539

したがって、添え字表記を使用すると、実際にはを使用するよりもはるかに高速であることがわかり__setitem__ます。Pythonicのこと、つまり、意図された方法で言語を使用することは、通常、より読みやすく、計算上効率的です。


1
2020年の違いはそれほどはっきりしていませんが(私のマシンでは1.35 msの添え字に対しては2msですd.__setitem__)、結論(特に最後の文)はまだ残っています。メソッド名ルックアップをループの外に引き上げると、時間は約1.65 msに短縮されました。残りの違いはおそらく、不可避のPython呼び出しメカニズムのオーバーヘッドによるものです。
holdenweb


58

辞書内に辞書を追加したい場合は、この方法で行うことができます。

例:辞書とサブ辞書に新しいエントリを追加する

dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)

出力:

{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}

注: Pythonでは、最初にサブを追加する必要があります

dictionary["dictionary_within_a_dictionary"] = {}

エントリを追加する前。


13
質問とは無関係に... php.netのマニュアルページ内のコメントのほとんどとして尋ねたので、これはです
エリックKaplun

2
1行でこれをやめることは何もありませんdictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}}(または、dictionary既に口述の場合はdictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}}
Chris

43

正統な構文はですがd[key] = value、キーボードに角かっこキーがない場合は、次のようにできます。

d.__setitem__(key, value)

実際、定義__getitem____setitem__メソッドは、独自のクラスで角括弧構文をサポートさせる方法です。https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriented_framework/special_class_methods.phpを参照してください


16
キーボードのブラケットキーなしでpythonでプログラムするのは非常に難しいと思います。
Bobort 2016年

2
これは、リスト内包表記内で辞書値を設定するために私が見つけた唯一の方法でした。ありがとう
クリススティーブンス

3
@chrisstevens理解度に値を設定したい場合、私が使用したハックは[a for a in my_dict if my_dict.update({'a': 1}) is None]です。
ジェレミーローガン

好奇心が強い...これは(すなわち角括弧がない)一般的ですか?
Aleister Tanek Javas Mraz

@chrisstevens @JeremyLogan dict内包表記を使用できるのに、なぜリスト内包表記を使用するのですか?{v: k for k, v in my_dict.items() if <some_conditional_check>}
1

36

作成できます:

class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        self[key] = value

## example

myd = myDict()
myd.add('apples',6)
myd.add('bananas',3)
print(myd)

与える:

>>> 
{'apples': 6, 'bananas': 3}

31

このよくある質問は、辞書とをマージする機能的な方法を扱っていますab

以下は、より簡単な方法の一部です(Python 3でテスト済み)...

c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )

注:上記の最初の方法は、キーbが文字列の場合にのみ機能します。

単一の要素を追加または変更するには、b辞書にはその1つの要素のみが含まれます...

c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'

これは...と同等です

def functional_dict_add( dictionary, key, value ):
   temp = dictionary.copy()
   temp[key] = value
   return temp

c = functional_dict_add( a, 'd', 'dog' )

8
PythonのBDFLからの最初のメソッドに関する興味深いコメント(ここ)。
nobar 2013

c = dict( a, **{'d':'dog'} )c = dict(a, d='dog')キーが既知であり、計算されていない限り、として記述した方がよいでしょう。
holdenweb

21

不変の世界に住んでいて、オリジナルを変更したくないが、オリジナルにdict新しいキーを追加した結果である新しいものを作成したいと仮定しましょう。

Python 3.5以降では、次のことができます。

params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}

Python 2で同等のものは次のとおりです。

params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})

これらのいずれかの後:

params まだ等しい {'a': 1, 'b': 2}

そして

new_params 等しい {'a': 1, 'b': 2, 'c': 3}

オリジナルを変更したくない場合があります(オリジナルに追加した結果だけが必要な場合があります)。私はこれが次のさわやかな代替物だと思います:

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3

または

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})

リファレンス:https : //stackoverflow.com/a/2255892/514866


2
私のプロファンクショナルプログラミングの同僚との長い会話の中で、良い点が持ち上がりました。上記のアプローチの欠点の1つは、コードを読んでいる誰か**がPythonに慣れていない場合(多くはそうでない場合)、何が起こっているのかが明確にならないことです。読みやすくするために、機能性の低いアプローチを好む場合があります。
campeterson、2018年

5
読者が知っているPython言語のサブセットを予測することはできないため、言語全体を理解していると想定して、ドキュメントで検索していない部分を検索するのは当然です。
ガブリエル

17

非常に多くの回答があり、それでも誰もが奇妙な名前の付いた、奇妙な行動をしたことを忘れていましたが、それでもまだ便利です dict.setdefault()

この

value = my_dict.setdefault(key, default)

基本的にこれを行います:

try:
    value = my_dict[key]
except KeyError: # key not found
    value = my_dict[key] = default

例えば

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored

5

2つのディクショナリを結合するのではなく、新しいキーと値のペアをディクショナリに追加する場合、添え字表記を使用するのが最善の方法のようです。

import timeit

timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
>> 0.49582505226135254

timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383

ただし、たとえば数千の新しいキーと値のペアを追加する場合は、このupdate()メソッドの使用を検討する必要があります。


3

私はそれがまた、Pythonの指摘に有用であろうと思うcollections簡素化する多くの便利な辞書のサブクラスとラッパーで構成され、モジュールの辞書内のデータ・タイプの追加や変更を具体的には、defaultdict

欠損値を提供するためにファクトリ関数を呼び出すdictサブクラス

これは、リストの辞書など、常に同じデータ型または構造で構成される辞書を使用している場合に特に便利です。

>>> from collections import defaultdict
>>> example = defaultdict(int)
>>> example['key'] += 1
>>> example['key']
defaultdict(<class 'int'>, {'key': 1})

キーがまだ存在しない場合、defaultdict指定された値(この場合は10)を初期値として辞書に割り当てます(ループ内でよく使用されます)。したがって、この操作は2つのことを実行します。新しい質問を(質問に従って)辞書追加し、キーがまだ存在しない場合は値割り当てます。標準ディクショナリで+=は、操作がまだ存在しない値にアクセスしようとしているため、エラーが発生します。

>>> example = dict()
>>> example['key'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'

を使用しない場合defaultdict、新しい要素を追加するコードの量ははるかに多くなり、おそらく次のようになります。

# This type of code would often be inside a loop
if 'key' not in example:
    example['key'] = 0  # add key and initial value to dict; could also be a list
example['key'] += 1  # this is implementing a counter

defaultdictlistand などの複雑なデータ型でも使用できますset

>>> example = defaultdict(list)
>>> example['key'].append(1)
>>> example
defaultdict(<class 'list'>, {'key': [1]})

要素を追加すると、リストが自動的に初期化されます。


3

ここに私がここで見なかった別の方法があります:

>>> foo = dict(a=1,b=2)
>>> foo
{'a': 1, 'b': 2}
>>> goo = dict(c=3,**foo)
>>> goo
{'c': 3, 'a': 1, 'b': 2}

辞書コンストラクターと暗黙の展開を使用して、辞書を再構築できます。さらに、興味深いことに、このメソッドを使用して、辞書の構築中に位置の順序を制御できます(Python 3.6以降)。実際、Python 3.7以降では挿入順序が保証されています!

>>> foo = dict(a=1,b=2,c=3,d=4)
>>> new_dict = {k: v for k, v in list(foo.items())[:2]}
>>> new_dict
{'a': 1, 'b': 2}
>>> new_dict.update(newvalue=99)
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99}
>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}
>>> 

上記は辞書内包表記を使用しています。


2

最初に、キーがすでに存在するかどうかを確認します

a={1:2,3:4}
a.get(1)
2
a.get(5)
None

次に、新しいキーと値を追加できます


0

辞書キー、値クラスを追加します。

class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        #self[key] = value # add new key and value overwriting any exiting same key
        if self.get(key)!=None:
            print('key', key, 'already used') # report if key already used
        self.setdefault(key, value) # if key exit do nothing


## example

myd = myDict()
name = "fred"

myd.add('apples',6)
print('\n', myd)
myd.add('bananas',3)
print('\n', myd)
myd.add('jack', 7)
print('\n', myd)
myd.add(name, myd)
print('\n', myd)
myd.add('apples', 23)
print('\n', myd)
myd.add(name, 2)
print(myd)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.