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

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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

今週のコミックコンですべての素晴らしいものに追いつく方法

今週のコミックコンですべての素晴らしいものに追いつく方法

サンディエゴコミックコンは今週開幕し、オタクのアナウンス、ポスター、予告編、お気に入りの番組や映画のからかいでいっぱいになります。SDCCは、コンベンションフロア全体の多くのパネルで行われているため、すべてに対応するのは難しい場合があります。

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

小さなアプリ開発者は金曜日に発表された法的な和解でグーグルから9千万ドルをこじ開けた。アップルとの同様の合意に続いて熱くなった。金曜日のブログ投稿で、Googleは、Androidメーカーが市場での優位性を悪用してPlayストア経由でのアプリ内購入に対して30%の料金を不当に請求したと主張するアプリ開発者との訴訟を解決するために、9千万ドルを支払うことに合意したと述べました。

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

今週、RadioShackのTwitterアカウントは、奇妙なものから完全にひどいものになりました。短い順序で、会社のフィード全体が、バイブレーター、「ビッグティット」(スペルミス)、有名人やその他の企業アカウントを荒らしているツイートなど、NSFW素材の真の山になりました。

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

大型ハドロン衝突型加速器のトンネル内にあるコンパクトミュオンソレノイド(CMS)検出器。2012年7月4日、CERNの科学者たちは、1960年代に最初に提案された素粒子であるヒッグス粒子の観測を確認しました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Un breve viaje espacial sobre conceptualizar el diseño

Complicarse la vida, mezclar churros con meninas (nada de ovejas) y encontrar valor en un trastero que adquiriste en una puja.

Un breve viaje espacial sobre conceptualizar el diseño

Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language