programing

사전에서 요소 삭제

bestcode 2022. 11. 27. 11:34
반응형

사전에서 요소 삭제

Python에서 사전에서 항목을 삭제하려면 어떻게 해야 합니까?

원본 사전을 수정하지 않고 항목을 제거한 상태에서 다른 딕트를 얻으려면 어떻게 해야 합니까?

은 요소를 삭제합니다.

del d[key]

이로 인해 기존 사전이 변환되므로 동일한 인스턴스를 참조하는 다른 사용자에 대해 사전의 내용이 변경됩니다. 사전을 반환하려면 사전 복사본을 만듭니다.

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

dict()컨스트럭터가 얕은 복사본을 만듭니다.상세한 카피를 작성하려면 , 모듈을 참조해 주세요.


dict "dict "에 하는 것에 해 주세요.del/medition/etc.는 일정 시간에서 선형 시간으로 이동하고 선형 공간을 사용한다는 의미입니다.작은 딕트의 경우, 이것은 문제가 되지 않습니다.그러나 대용량 딕트의 복사본을 많이 만들 계획이라면 아마도 HAMT와 같은 다른 데이터 구조를 원할 것입니다(이 답변에서 설명함).

pop 사전을 변환합니다.

 >>> lol = {"hello": "gdbye"}
 >>> lol.pop("hello")
     'gdbye'
 >>> lol
     {}

원본을 보관하고 싶으시면 복사하시면 됩니다.

저는 당신의 솔루션이 그것을 하는 가장 좋은 방법이라고 생각합니다.그러나 다른 솔루션을 원하는 경우 지정된 키를 포함하지 않고 이전 사전의 키를 사용하여 다음과 같이 새 사전을 만들 수 있습니다.

>>> a
{0: 'zero', 1: 'one', 2: 'two', 3: 'three'}
>>> {i:a[i] for i in a if i!=0}
{1: 'one', 2: 'two', 3: 'three'}

좋은 답변들이 많은데 한 가지 강조하고 싶은 게 있어요.

메소드와 일반 을 모두 사용하여 사전에서 항목을 제거할 수 있습니다.둘 다 원본 사전을 변환하므로 복사본을 만들어야 합니다(아래 세부 정보 참조).

입력한 키가 사전에 없는 경우 둘 다 를 불러옵니다.

key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove]  # Raises `KeyError: 'c'`

그리고.

key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove)  # Raises `KeyError: 'c'`

이 문제를 해결해야 합니다.

예외를 캡처하면 다음과 같이 캡처합니다.

key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
    del d[key_to_remove]
except KeyError as ex:
    print("No such key: '%s'" % ex.message)

그리고.

key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
    d.pop(key_to_remove)
except KeyError as ex:
    print("No such key: '%s'" % ex.message)

다음 작업을 수행합니다.

key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
    del d[key_to_remove]

그리고.

key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
    d.pop(key_to_remove)

, 하하와 함께pop()또한 기본 반환값을 제공하는 훨씬 간결한 방법도 있습니다.

key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None)  # No `KeyError` here

「 」를하지 한pop()한 것은 무엇이든 할 수 한 것은 없습니다.None그 정도일 수도 있지만delin때문에 체크가 약간 빠르다pop()오버헤드를 초래하는 복잡한 기능을 가지고 있습니다. 않기 에, 통은 usually usually usually usually usually usually usually usually usually usually usually usually usuallypop()디폴트값으로 충분합니다.


본문제는 사전을 복사해서 원래 사전을 저장하고 키를 제거하지 않고 새 사전을 만들어야 합니다.

여기 있는 다른 사람들은 로 완전한 (깊이) 카피를 만들 것을 제안합니다.이것은 과잉일 수도 있고, "일반적인" 카피, 또는 를 사용하는 것으로 충분할 수도 있습니다.사전에서는 객체에 대한 참조를 키의 값으로 유지합니다.따라서 사전에서 키를 제거하면 참조 중인 개체가 아니라 이 참조가 제거됩니다.메모리에 오브젝트에 대한 다른 참조가 없는 경우 오브젝트 자체는 나중에 가비지 컬렉터에 의해 자동으로 삭제될 수 있습니다.딥 카피를 작성하려면 , 얕은 카피에 비해 많은 계산이 필요하기 때문에, 카피를 작성하거나 메모리를 낭비하거나 GC에 작업을 더 많이 제공하거나 하는 것으로, 코드 퍼포먼스를 저하시킵니다.경우에 따라서는 얕은 카피로도 충분할 수 있습니다.

그러나 사전 값으로 변경 가능한 개체가 있고 나중에 키를 사용하지 않고 반환된 사전에서 개체를 수정하려는 경우에는 딥 복사를 수행해야 합니다.

얕은 복사:

def get_dict_wo_key(dictionary, key):
    """Returns a **shallow** copy of the dictionary without a key."""
    _dict = dictionary.copy()
    _dict.pop(key, None)
    return _dict


d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"

new_d = get_dict_wo_key(d, key_to_remove)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d)  # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d)  # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2222}

딥 카피 포함:

from copy import deepcopy


def get_dict_wo_key(dictionary, key):
    """Returns a **deep** copy of the dictionary without a key."""
    _dict = deepcopy(dictionary)
    _dict.pop(key, None)
    return _dict


d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"

new_d = get_dict_wo_key(d, key_to_remove)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2222}

진술서는 당신이 찾고 있는 거예요foo라는 이름의 사전과 'bar'라는 키가 있는 경우 다음과 같이 foo에서 'bar'를 삭제할 수 있습니다.

del foo['bar']

이렇게 하면 작동 중인 사전이 영구적으로 변경됩니다.원본 사전을 보관하려면 미리 복사본을 만들어야 합니다.

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

콜이 얕은 카피를 작성한다.상세한 카피를 필요로 하는 경우는, 을 사용해 주세요.

다음은 사용자의 편의를 위해 복사하여 붙여넣을 수 있는 방법입니다.

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy

… 복사본을 반환하기 위해 사전에서 항목을 삭제하려면(원본을 수정하지 않음) 어떻게 해야 합니까?

A dict잘못된 데이터 구조입니다.

물론 복사에서 dict를 복사하고 팝업을 하는 것도 문제 없습니다.또한 새로운 dict를 작성하는 것도 문제 없습니다.복사에는 시간이 걸립니다.정시 연산을 선형 연산으로 대체했습니다.이러한 모든 복사본은 동시에 공간을 차지합니다. 즉, 복사본당 선형 공간입니다.

해시 어레이 매핑 시도와 같은 다른 데이터 구조는 정확히 이러한 사용 사례에 맞게 설계되었습니다. 요소를 추가하거나 제거하면 복사본을 로그 시간 내에 반환하고 스토리지의 대부분1원본과 공유합니다.

물론 단점도 있다.퍼포먼스는 일정하지 않고 로그적입니다(단, 일반적으로 32~128의 큰 베이스를 사용합니다).되지 않는 를 API와 수 .dict'변환' API는 분명히 다릅니다.그리고 무엇보다도 2Python에는 HAMT 배터리가 포함되어 있지 않습니다.

라이브러리는 Python을 위한 HAMT 기반의 dict-replacements(및 기타 다양한 유형)의 꽤 견고한 구현입니다.기존 변환 코드를 가능한 한 부드럽게 영구 코드로 포팅하기 위한 nifty evolver API도 갖추고 있습니다.그러나 변환이 아닌 복사본 반환에 대해 명확하게 하려면 다음과 같이 사용합니다.

>>> from pyrsistent import m
>>> d1 = m(a=1, b=2)
>>> d2 = d1.set('c', 3)
>>> d3 = d1.remove('a')
>>> d1
pmap({'a': 1, 'b': 2})
>>> d2
pmap({'c': 3, 'a': 1, 'b': 2})
>>> d3
pmap({'b': 2})

★★★d3 = d1.remove('a')정확히 질문의 대상입니다.

다음과 같은 가변 데이터 구조를 가지고 있는 경우dict ★★★★★★★★★★★★★★★★★」listpmap아직 있습니다하려면 , 「, 「불변」을 해 둘 필요가 있습니다.이 문제를 수정하려면 , 모든 것을 아래로 이동해, 내장하는 것 밖에 할 수 있습니다.pmap §pvectors.


1. HAMT는 Scala, Clojure, Haskell과 같은 언어에서도 인기를 끌고 있습니다.이는 HAMT가 잠금 없는 프로그래밍과 소프트웨어 트랜잭션 메모리에서 매우 잘 작동하기 때문입니다. 그러나 둘 다 Python과 관련이 없습니다.

2. 실제로 의 구현에 사용되는 stdlib에는 HAMT가 있습니다.이전에 철회된 PEP는 그 이유를 설명한다.그러나 이것은 라이브러리의 숨겨진 구현 세부 사항이지 공개 수집 유형이 아닙니다.

d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

★★★★★d = {1: 2, '2': 3}

del d['key']에게 전화하기만 하면 됩니다.

그러나 프로덕션에서는 항상 d에 '키'가 있는지 확인하는 것이 좋습니다.

if 'key' in d:
    del d['key']

del을 사용하여 해당 값의 키를 전달하는 dict 값을 삭제할 수 있습니다.

링크: del 메서드

del dictionary['key_to_del']

아니요, 다른 방법은 없습니다.

def dictMinus(dct, val):
   copy = dct.copy()
   del copy[val]
   return copy

다만, 약간 변경된 사전의 카피를 작성하는 것은, 메모리 요구량이 상대적으로 커지기 때문에, 좋은 생각이 아닌 경우가 많습니다.일반적으로 오래된 사전을 로그로 기록하고(필요한 경우라도) 수정하는 것이 좋습니다.

# mutate/remove with a default
ret_val = body.pop('key', 5)
# no mutation with a default
ret_val = body.get('key', 5)

여기에서는, 톱 레벨의 설계 어프로치입니다.

def eraseElement(d,k):
    if isinstance(d, dict):
        if k in d:
            d.pop(k)
            print(d)
        else:
            print("Cannot find matching key")
    else:
        print("Not able to delete")


exp = {'A':34, 'B':55, 'C':87}
eraseElement(exp, 'C')

나는 사전과 내가 원하는 키를 내 함수에 전달하고 사전인지, 키가 괜찮은지 확인하고 둘 다 존재하는 경우 사전에서 값을 제거하고 남은 부분을 출력합니다.

★★★★★{'B': 55, 'A': 34}

도움이 됐으면 좋겠네요!

>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

처리는 않고, 것을 로 하고, .받아쓰다★★★★★★★★★★★★★★★★★★★★★★★·raise 않으면

아래 코드 스니펫은 확실히 도움이 될 것입니다.코드의 이해에 도움이 되는 코멘트를 각 행에 추가했습니다.

def execute():
   dic = {'a':1,'b':2}
   dic2 = remove_key_from_dict(dic, 'b')  
   print(dict2)           # {'a': 1}
   print(dict)            # {'a':1,'b':2}

def remove_key_from_dict(dictionary_to_use, key_to_delete):
   copy_of_dict = dict(dictionary_to_use)     # creating clone/copy of the dictionary
   if key_to_delete in copy_of_dict :         # checking given key is present in the dictionary
       del copy_of_dict [key_to_delete]       # deleting the key from the dictionary 
   return copy_of_dict                        # returning the final dictionary

또는 dict.pop()을 사용할 수도 있습니다.

d = {"a": 1, "b": 2}

res = d.pop("c")  # No `KeyError` here
print (res)       # this line will not execute

더 나은 접근법은

res = d.pop("c", "key not found")
print (res)   # key not found
print (d)     # {"a": 1, "b": 2}

res = d.pop("b", "key not found")
print (res)   # 2
print (d)     # {"a": 1}

다음은 목록 이해를 사용한 다른 변형입니다.

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.iteritems() if v)
# result should be {'b': 'Some'}

이 접근방식은 이 투고로부터의 회답에 근거하고 있습니다.즉, 빈 문자열이 있는 키를 딕트에서 삭제하는 효율적인 방법입니다.

Python 3의 경우 이는

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.items() if v)
print(d)
    species = {'HI': {'1': (1215.671, 0.41600000000000004),
  '10': (919.351, 0.0012),
  '1025': (1025.722, 0.0791),
  '11': (918.129, 0.0009199999999999999),
  '12': (917.181, 0.000723),
  '1215': (1215.671, 0.41600000000000004),
  '13': (916.429, 0.0005769999999999999),
  '14': (915.824, 0.000468),
  '15': (915.329, 0.00038500000000000003),
 'CII': {'1036': (1036.3367, 0.11900000000000001), '1334': (1334.532, 0.129)}}

다음 코드는 dict의 복사본을 만듭니다.species에 없는 아이템을 삭제합니다.trans_HI

trans_HI=['1025','1215']
for transition in species['HI'].copy().keys():
    if transition not in trans_HI:
        species['HI'].pop(transition)

해결책 1: 삭제 시

info = {'country': 'Iran'}
country = info.pop('country') if 'country' in info else None

해결책 2: 삭제하지 않음

info = {'country': 'Iran'}
country = info.get('country') or None

제 방법을 시도해 보세요.한 줄로.

yourList = [{'key':'key1','version':'1'},{'key':'key2','version':'2'},{'key':'key3','version':'3'}]
resultList = [{'key':dic['key']} for dic in yourList if 'key' in dic]
print(resultList)

언급URL : https://stackoverflow.com/questions/5844672/delete-an-element-from-a-dictionary

반응형