2014-11-27 13 views
5

Tôi có một từ điển lồng nhau và tôi muốn có thể xóa một khóa tùy ý bên trong nó.Tự động xóa một mục khỏi một từ điển lồng nhau

Từ điển có thể trông như thế này:

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

Nhưng nó có thể là kích thước tùy ý. Vấn đề là các phím nên được lấy từ một "danh sách khóa" tìm kiếm, ví dụ, như thế này:

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

key_list có thể là kích thước tùy ý và có bất kỳ phím của từ điển trong nó.

Bởi vì các tiêu chí trên, tôi không thể chỉ cần sử dụng:

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

vì tôi không thể biết trước đó chìa khóa mà key_list sẽ chứa.

Vậy mã chung sẽ trông như thế nào dựa trên nội dung của key_list, xóa mục tương ứng trong từ điển D?

+0

bạn có chắc chắn về thứ tự của 'key_list' và nếu bạn muốn xóa mục tương ứng, nó không tăng' KeyError'! – Kasramvd

+0

No KeyError for me no. – PandaDeTapas

+0

Hai câu hỏi có thể tinh chỉnh vấn đề trong tâm trí của tôi: 1) Mục đích mỗi lần xóa một cặp khóa/giá trị duy nhất khỏi từ điển? 2) Là chuỗi trong đó các phím xuất hiện trong key_list có ý nghĩa? Tôi cho rằng câu hỏi thứ hai giống như những gì @Kasra đang hỏi. – rchang

Trả lời

4

Bạn có thể sử dụng cho vòng lặp phải đi qua các giá trị trong key_list và điều hướng đến các tiểu từ điển mà bạn muốn loại bỏ các mục từ:

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

Cuối cùng, sub sẽ là từ điển mà bạn muốn thay đổi. Tất cả những gì bạn cần làm bây giờ là:

del sub[key_list[-1]] 

là từ khóa cần xóa.

Dưới đây là một minh chứng:

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

Như bạn có thể thấy, đây là tương đương với:

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

trừ rằng giải pháp rất linh hoạt (không mã hóa cứng các phím).

+0

Dường như nó hoạt động rất tốt! Tôi đã không nhận ra phụ có thể ảnh hưởng đến D, giải pháp tốt đẹp. – PandaDeTapas

0

Bạn có thể nghĩ từ điển lồng nhau, làm từ điển có khóa nhiều phần. Nếu bạn chuyển đổi dict của bạn, sau đó bạn quyết định khi nào để xóa một phần tử. Nếu một phần của khóa nằm trong danh sách khóa hoặc bất kỳ tiêu chí nào khác. Hãy xem xét điều này:

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'} 
Các vấn đề liên quan