사전에 새 키를 추가하려면 어떻게해야합니까?


2619

파이썬 사전을 만든 후에 키를 파이썬 사전에 추가 할 수 있습니까?

방법이없는 것 같습니다 .add().


25
여기에 키를 추가하는 방법을 알아 내려고 노력하는 경우 돌아가 사전을, 당신은 python3.5 +에이 작업을 수행 할 수 있습니다 {**mydict, 'new_key': new_val}.
cs95

허용되는 답변을 사용하십시오 : d [ 'mynewkey'] = 'mynewvalue'또는 val = d.setdefault ( 'mynewkey', 'mynewvalue')
Ol 'Dawg

답변:


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

107
설명은 다음과 같습니다. 해당 키에 값을 할당하여 사전에 새 키 / 값 쌍을 만듭니다. 키가 존재하지 않으면 키가 추가되고 해당 값을 가리 킵니다. 존재하는 경우 현재 값을 덮어 씁니다.
R. Navega

9
.update()방법 과 방법 의 차이점은 무엇입니까 ? 언제 어느 쪽이 더 낫습니까?
hegash 2009 년

14
@hegash는 d[key]=val구문을 짧게하고 모든 객체를 키로 처리 할 수 ​​있으며 (해시 가능한 한) 하나의 값만 설정하지만 키가있는 한 .update(key1=val1, key2=val2)여러 개의 값을 동시에 설정하려는 경우 더 좋습니다 kwargs가 문자열로 변환되므로 문자열입니다. dict.update다른 사전을 사용할 수도 있지만 개인적으로 다른 사전을 업데이트하기 위해 새 사전을 명시 적으로 작성하지 않는 것이 좋습니다.
bgusach

그것을보십시오, 여기에 예가 있습니다 : repl.it/@SmaMa/Add-key-to-dict
Sma Ma

중첩 된 dict에 요소를 어떻게 추가 할 수 있습니까? PHP처럼$foo[ ] = [ . . . . ]
Juan-Kabbali

1042

여러 키를 동시에 추가하려면 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
키 하나만 업데이트하기 위해 사전을 만드는 것은 비효율적입니다. 키가 두 개 이상인 경우에만이 작업을 수행하십시오 (예를 들면 더 나은 임계 값이있을 수 있음)
Jean-François Fabre

10
@ Jean-FrançoisFabre 이것은 예제 코드입니다. 답변을 모든 경우를 다루는 것으로 취급해서는 안됩니다.
Robert Brisita

1
그것은 하나의 키를 추가하는 선호되는 방법이라는 잘못된 인상을줍니다.
Jean-François Fabre

@ Jean-FrançoisFabre Python 3.7+ (및 3.6+에서 제공) 에서는 dict 순서가 보장 되므로 order가 중요 할 때 단일 키를 추가하는 것이 좋습니다.
ingyhere

당신이 만드는 경우와 같은 다른 키 값이 너무 결국입니다. 어쨌든 답변이 편집되었으며 지금은 훨씬 좋습니다. 사전에 업데이트하면 많은 항목이 포함되어있을 가능성이 높습니다. x[-1] = 44-1
Jean-François Fabre

927

파이썬 사전에 대한 정보를 통합하고 싶습니다.

빈 사전 만들기

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

두 목록에서 사전 만들기

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

"파이썬 사전을 만든 후에 키를 추가 할 수 있습니까? .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 메소드를 사용 하여이 작업을 수행하는 또 다른 효율적인 방법은 키워드 인수를 사용하는 것입니다.하지만 합법적 인 파이썬 단어 여야하므로 공백이나 특수 기호를 사용하거나 숫자로 이름을 시작할 수 없지만 많은 사람들이이를 더 읽기 쉬운 방법으로 생각합니다 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'}

이제 우리는을 업데이트하는 세 가지 파이썬 방식을 다루었습니다 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__. 파이썬적인 일을하는 것, 즉 사용되는 방식으로 언어를 사용하는 것은 일반적으로 더 읽기 쉽고 계산적으로 효율적입니다.


1
d.__setitem__결론 (특히 마지막 문장)은 여전히 ​​유지되지만 차이는 2020 년 (내 컴퓨터에서 1.35ms 아래 첨자 대 2ms ) 보다 덜 두드러집니다 . 루프에서 메소드 이름 조회를 올리면 시간이 약 1.65ms로 단축되었습니다. 나머지 차이점은 피할 수없는 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'}}}

참고 : 파이썬은 먼저 하위를 추가해야합니다

dictionary["dictionary_within_a_dictionary"] = {}

항목을 추가하기 전에.


13
이것은 php.net 매뉴얼 페이지에있는 대부분의 주석처럼 질문과 무관합니다 ...
Erik Kaplun

2
한 줄로이 작업을 중단 할 수있는 것은 없습니다 : dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}}(또는 dictionary이미 dict 인 경우 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
키보드에 괄호 키가 없으면 파이썬으로 프로그래밍하는 것이 매우 어렵다는 것을 알았습니다.
Bobort

2
이것이 목록 이해 내에서 사전 값을 설정하는 유일한 방법이었습니다. 감사합니다
크리스 스티븐스

3
@ chrisstevens 만약 내가 사용한 핵이 이해력으로 값을 설정하고 싶다면 [a for a in my_dict if my_dict.update({'a': 1}) is None].
Jeremy Logan

궁금합니다 ... 이것은 (대괄호가 빠진) 공통입니까?
Aleister Tanek Javas Mraz

dict comprehension을 사용할 수 있는데 왜리스트 이해를 사용합니까? {v: k for k, v in my_dict.items() if <some_conditional_check>}
ingyhere

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사전에는 하나의 요소 만 포함됩니다.

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
파이썬 BDFL ( here ) 의 첫 번째 방법에 대한 흥미로운 의견 .
nobar

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
친 기능 프로그래밍 동료와의 긴 대화에서 좋은 지적이있었습니다. 위의 접근 방식의 한 가지 단점은 코드를 읽는 사람 **이 파이썬에서 익숙하지 않은 경우 (많은 사람은 아님) 무슨 일이 일어나고 있는지 분명하지 않다는 것입니다. 가독성을 높이기 위해 기능적 접근 방식을 선호하지 않는 경우가 있습니다.
campeterson

5
우리는 독자들이 아는 파이썬 언어의 부분 집합을 예측할 수 없으므로 전체 언어를 알고 있다고 가정하여 문서에서 그렇지 않은 부분을 검색한다고 가정하는 것이 공정합니다.
Gabriel

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

두 개의 사전을 결합하지 않고 사전에 새 키-값 쌍을 추가하는 경우 아래 첨자 표기법을 사용하는 것이 가장 좋습니다.

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

나는 또한 파이썬의 지적 도움이 될 것이라고 생각 collections단순화 많은 유용한 사전 서브 클래스와 래퍼 구성 모듈 사전에 추가 및 데이터 유형의 수정 특별히를 defaultdict:

누락 된 값을 제공하기 위해 팩토리 함수를 호출하는 dict 서브 클래스

이것은 항상 동일한 데이터 유형 또는 구조로 구성된 사전 (예 : 목록 사전)으로 작업하는 경우에 특히 유용합니다.

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

키가 아직 존재하지 않으면 defaultdict주어진 값 (이 경우에는 10)을 초기 값으로 지정합니다 (종종 루프 내부에서 사용됨). 이 :이 작업은 따라서 두 가지 일을 (질문에 따라) 사전에 새 키를 추가 하고 키가 아직 존재하지 않는 경우 값을 할당합니다. 표준 사전을 사용하면 +=작업이 아직 존재하지 않는 값에 액세스하려고 할 때 오류가 발생 합니다.

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

defaultdict또한 복잡한 데이터 형식으로 사용될 수 listset:

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