[英]Recursive dictionary modification in python
翻譯這本字典最簡單的方法是什么:
{'item':{'w':{'c':1, 'd':2}, 'x':120, 'y':240, 'z':{'a':100, 'b':200}}}
進入這一個:
{'item':{'y':240, 'z':{'b':200}}}
只考慮到你需要變量y和b同時保持字典的結構? 項目的大小或數量或字典的深度應該無關緊要,因為我正在使用的那個可以是2到5級深度。
編輯:我為之前的類型道歉,並澄清,我給了一個字符串數組(例如['y','b']),我需要在字典中找到,然后只保留'y'和'b '以及任何其他鍵以保持原始字典的結構,在這種情況下,它將是'z'
在這里我可以找到一個更好的例子,我需要芯片組模型,VRAM和分辨率。
關於注釋,輸入將是上面的鏈接作為起始字典以及作為保持列表的['chipset model','vram','resolution']的數組。 它應該返回:
{'Graphics/Displays':{'NVIDIA GeForce 7300 GT':{'Chipset Model':'NVIDIA GeForce 7300 GT', 'Displays':{'Resolution':'1440 x 900 @ 75 Hz'}, 'VRAM (Total)':'256 Mb'}}
假設您要分配給超級字典的元素的字典是foo
,您可以這樣做:
my_dictionary['keys']['to']['subdict']=foo
關於你的編輯 - 除了特定列表上的那些鍵之外你需要消除所有鍵 - 這個函數應該可以解決這個問題:
def drop_keys(recursive_dict,keep_list):
key_list=recursive_dict.keys()
for key in key_list:
if(type(recursive_dict[key]) is dict):
drop_keys(recursive_dict[key], keep_list)
elif(key not in keep_list):
del recursive_dict[key]
像這樣的東西?
d = {'item': {'w': {'c': 1, 'd': 2}, 'x': 120, 'y': 240, 'z': {'a': 100, 'b': 200}}}
l = ['y', 'z']
def do_dict(d, l):
return {k: v for k, v in d['item'].items() if k in l}
這是我到達的遞歸解決方案,最終類似於@Dan發布的內容:
def recursive_del(d,keep):
for k in d.copy():
if type(d[k]) == dict:
recursive_del(d[k],keep)
if len(d[k]) == 0: #all keys were deleted, clean up empty dict
del d[k]
elif k not in keep:
del d[k]
演示:
>>> keepset = {'y','b'}
>>> a = {'item':{'w':{'c':1, 'd':2}, 'x':120, 'y':240, 'z':{'a':100, 'b':200}}}
>>> recursive_del(a,keepset)
>>> a
{'item': {'z': {'b': 200}, 'y': 240}}
我認為他唯一遺漏的是你需要有時需要清理掉已刪除所有密鑰的字謎; 即,如果沒有這種調整,你最終會在你的示例輸出中找到一個殘留的'w':{}
。
使用你的第二個例子我做了這樣的事情,它不是很漂亮,但應該很容易擴展。 如果你的樹開始變大,你可以定義一些規則來解析dict。
這里的每條規則實際上都是“當我處於哪個州時應該怎么做”。
def rule2(key, value):
if key == 'VRAM (Total)':
return (key, value)
elif key == 'Chipset Model':
return (key, value)
def rule1(key, value):
if key == "Graphics/Displays":
if isinstance(value, dict):
return (key, recursive_checker(value, rule1))
else:
return (key, value)
else:
return (key, recursive_checker(value, rule2))
def recursive_checker(dat, rule):
def inner(item):
key = item[0]
value = item[1]
return rule(key, value)
return dict(filter(lambda x: x!= None, map(inner, dat.items())))
# Important bits
print recursive_checker(data, rule1)
在你的情況下,因為沒有很多狀態,所以不值得這樣做但是如果你有多張牌並且你不必知道應該遍歷哪個鍵但只知道你想要樹中的某些鍵。 此方法可用於輕松搜索樹。 它可以應用於很多東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.