私は以前に同様の質問がすでに行われていることを知っていますが、私の特別な場合にそれらを実装するのに本当に問題があります:
たとえば、さまざまな深さの辞書があるとします。
dicti = {'files':
{'a':{'offset':100, 'start': 0},
'b':{
'c':{'offset':50, 'start':0}
'd':{'offset':70, 'start':0}
}
'e':{
'f':{'offset':80, 'start':0}
'g':{'offset':30, 'start':0}
'h':{'offset':20, 'start':0}
}
}
}
etc... (with a lot more different levels and entries)
だから今、私は基本的に同じ構造とキーを持つその辞書のコピーが欲しいのですが、'offset'
(どのレベルでも)より大きい場合は、次の50
'offset'
ように変更する必要があります0
ある種の反復関数が最適だと思いますが、頭を悩ませることはできません...
コピーに標準の機構を使用してから、コピーした辞書を変更するか(私の例ではソリューション#1)、同じ関数でコピーと変更を行うことができます(ソリューション#2)。
どちらの場合でも、再帰関数を探しています。
import copy
from pprint import pprint
dicti = {'files':
{'a':{'offset':100, 'start': 0},
'b':{
'c':{'offset':50, 'start':0},
'd':{'offset':70, 'start':0},
},
'e':{
'f':{'offset':80, 'start':0},
'g':{'offset':30, 'start':0},
'h':{'offset':20, 'start':0},
}
}
}
# Solution 1, two passes
def modify(d):
if isinstance(d, dict):
if d.get('offset', 0) > 50:
d['offset'] = 0
for k,v in d.items():
modify(v)
dictj = copy.deepcopy(dicti)
modify(dictj)
pprint(dictj)
# Solution 2, copy and modify in one pass
def copy_and_modify(d):
if isinstance(d, dict):
d2 = {k:copy_and_modify(v) for k,v in d.items()}
if d2.get('offset') > 50:
d2['offset'] = 0
return d2
return d
dictj = copy_and_modify(dicti)
pprint(dictj)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加