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

2791
lfaraone 2009-06-22 12:07.

作成後にPythonディクショナリにキーを追加することはできますか?

.add()方法がないようです。

16 answers

3620
Paolo Bergantino 2009-06-22 12:09.
d = {'key': 'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'key': 'value', 'mynewkey': 'mynewvalue'}

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

1098
Noname 2009-07-23 04:48.

複数のキーを同時に追加するには、次を使用します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}

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

1018
Yugal Jindle 2011-12-05 20:07.

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'

Python 3.9以降:

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

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

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

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

Python 3.5以降:

これは、辞書の解凍と呼ばれる新機能を使用します。

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

Python 3.9以降:

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

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

辞書の項目を削除する

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))
154
Aaron Hall 2014-11-30 13:57.

「Pythonディクショナリの作成後にキーを追加することは可能ですか?.add()メソッドがないようです。」

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

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

my_dict = {}

ベストプラクティス1:添え字表記

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

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メソッドでこれを行うもう1つの効率的な方法は、キーワード引数を使用することですが、それらは正当なPython単語である必要があるため、スペースや特別な記号を使用したり、名前を数字で始めたりすることはできませんが、多くの人がこれをより読みやすい方法と考えていますdictのキーを作成するために、ここでは余分な不要なものを作成しないようにし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つのPythonicの方法について説明しました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__ます。Pythonのようなことを行う、つまり、意図された方法で言語を使用することは、通常、より読みやすく、計算効率が高くなります。

101
Jason Creighton 2009-06-22 12:08.
dictionary[key] = value
59
Asher 2012-04-27 09:04.

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

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

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"] = {}

エントリを追加する前。

51
Colonel Panic 2013-04-14 14:58.

従来の構文はですがd[key] = value、キーボードに角括弧キーがない場合は、次のこともできます。

d.__setitem__(key, value)

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

38
kiriloff 2013-05-26 03:33.

次のいずれかを作成できます。

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}
32
Brent Bradburn 2013-08-18 13:04.

このよくある質問は、辞書とをマージする機能的な方法に対応しています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' )
22
campeterson 2018-01-13 09:31.

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

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

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

Python2に相当するものは次のとおりです。

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

19
Michael Ekoka 2017-10-24 04:03.

非常に多くの答えがありますが、それでも誰もが奇妙な名前、奇妙な振る舞い、そしてそれでも便利なことを忘れていました 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
6
Burak Özdemir 2018-10-11 22:57.

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()方法の使用を検討する必要があります。

5
ingyhere 2019-11-19 18:57.

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

>>> 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}
>>> 

上記は辞書理解を使用しています。

4
m_____z 2019-08-28 11:21.

collections辞書のデータ型の追加と変更を簡素化する多くの便利な辞書サブクラスとラッパーで構成されるPythonのモジュールを指摘することも役立つと思います。具体的にはdefaultdict次のとおりです。

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

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

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

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

>>> 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

defaultdictlistset:などの複雑なデータ型でも使用できます。

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

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

3
Agus Mathew 2019-03-26 03:01.

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

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

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

2
Susan 2020-02-04 15:47.

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

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)

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

スタートレックの50周年を称えるための最良の方法

スタートレックの50周年を称えるための最良の方法

来年は、スペースオペラの最も壮大で野心的なメディアシリーズの50周年を迎えます。しかし、スタートレックはその誇り高い遺産に沿って50歳の誕生日を迎えますか?スタートレックの誕生日を祝う方法はたくさんあります。

更新:合法的な大統領候補は数百万人を怒らせ、美しい女性は苦しむ

更新:合法的な大統領候補は数百万人を怒らせ、美しい女性は苦しむ

(画像提供:ゲッティイメージズ)ドナルド・トランプは、アメリカ合衆国大統領の立候補者となる比類のない外交的洞察力を示し、何百万人もの人々を怒らせ、彼の時代遅れの客体化に対する評価の主要な情報源を失いました。彼が立候補を発表し終える前にパレード。トランプ氏は演説の中で、この国で最も高い役職に選出された場合、米国との南の国境に壁を建設すると述べた一連の声明を発表した。

インターネット上で最も愚かな親ロシアのデマ

インターネット上で最も愚かな親ロシアのデマ

David L. Sternは、ウクライナのキエフを拠点とするフリーランスのライターです。

ディズニーフリークは今、独自の出会い系サイトを持っています

ディズニーフリークは今、独自の出会い系サイトを持っています

オンラインデートに関しては、船長、ベーコン愛好家、ポットヘッド向けに作られたサイトなど、長年にわたって選択できるニッチなサイトがたくさんあります。今、ディズニーファンは彼ら自身のマッチメイキングサイトを通して愛を見つけることができます。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language