2014-11-27 7 views
5

중첩 된 사전이있어서 그 안에있는 임의의 키를 삭제할 수 있기를 원합니다.중첩 된 사전에서 항목을 동적으로 삭제합니다.

사전은 다음과 같을 수 있습니다 :

D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}} 

그러나 그것은 임의의 크기가 될 수 있습니다. 문제는 키가 같은, 예를 들어, 찾고 "키 목록"에서주의해야한다는 것입니다 :

key_list = ['key1', 'key2', 'key4'] 

key_list 임의의 크기 여야하고 그것에서 사전의 키 중 하나를 가질 수있다.

때문에 위의 기준에, 난 그냥 사용할 수 없습니다

del D['key1']['key2']['key4'] 

내가 key_list이 포함됩니다 사전에 어떤 키를 알 수 없기 때문이다.

그렇다면 key_list의 콘텐츠를 기반으로하는 일반적인 코드는 사전 D의 해당 항목을 어떻게 삭제합니까?

+0

'key_list'의 순서에 대해 확실합니까? 해당 항목을 삭제하려면 'KeyError'를 발생시키지 마십시오! – Kasramvd

+0

나를위한 KeyError 없음 – PandaDeTapas

+0

내 마음 속에 문제를 결정화시킬 수있는 두 가지 질문 : 1) 사전에서 하나의 키/값 쌍을 제거 할 때마다 의도가 있습니까? 2) key_list에 키가 나타나는 순서가 중요합니까? 두 번째 질문은 @Kasra가 묻는 질문과 비슷하다고 생각합니다. – rchang

답변

4

당신은 key_list의 값을 가서에서 항목을 제거 할 하위 사전에 탐색 할에 대한 루프를 사용할 수 있습니다 결국

sub = D     # Start with the full dictionary 
for i in key_list[:-1]: 
    sub = sub[i]  # Move down a level 

, sub는 사전 될 것입니다 당신이 바꾸고 싶은 것. 지금해야 할 일은 다음과 같습니다.

del sub[key_list[-1]] 

key_list[-1]은 제거 할 키이므로 입력하십시오. 다음은

이 데모입니다 :이 솔루션은 동적 (NO 하드 코딩 된 키) 인 것을 제외하고

>>> D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}} 
>>> del D['key1']['key2']['key4'] 
>>> D 
{'key1': {'key5': 'value5', 'key2': {'key3': 'value3'}}} 
>>> 

:

>>> D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}} 
>>> key_list = ['key1', 'key2', 'key4'] 
>>> sub = D 
>>> for i in key_list[:-1]: 
...  sub = sub[i] 
... 
>>> del sub[key_list[-1]] 
>>> D 
{'key1': {'key5': 'value5', 'key2': {'key3': 'value3'}}} 
>>> 

당신이 볼 수 있듯이,이 동일합니다.

+0

잘 작동하는 것 같습니다! 나는 서브가 D, 좋은 해결책에 영향을 줄 수 있다는 것을 깨닫지 못했습니다. – PandaDeTapas

0

중첩 된 사전은 멀티 파트 키가있는 사전으로 생각할 수 있습니다. 당신이 당신의 dict를 변환한다면, 당신은 언제 요소를 삭제할지를 결정한다. 키의 일부가 키 목록에 있거나 다른 기준이있는 경우 이것을 고려해보십시오 :

D={'key1':{'key2':{'key3':'value3', 'key4':'value4', 'key7':{'key8':'value8'}}, 'key5':'value5'}, 'key6': 'value6'} 

def multipart_key(d): 
    dd = {} 
    for k in d: 
     if isinstance(d[k], dict): 
      inner = multipart_key(d[k]) 
      for kk in inner: 
       dd[k+chr(124)+kk] = inner[kk] 
     else: 
      dd[k] = d[k] 
    return dd 

key_list = ['key3', 'key7'] 

DD = multipart_key(D) 
newDD = DD.copy() 

for k in DD: 
    for kk in k.split(chr(124)): 
     if kk in key_list: 
      del newDD[k] 
      break 

print(DD) 
# {'key1|key2|key3': 'value3', 'key1|key5': 'value5', 'key6': 'value6', 'key1|key2|key7|key8': 'value8', 'key1|key2|key4': 'value4'} 

print(newDD) 
# {'key1|key5': 'value5', 'key6': 'value6', 'key1|key2|key4': 'value4'} 
관련 문제