問題陳述
我的目標是通過使用映射串列重新映射具有不同深度的嵌套字典的鍵(主要是通過交換它們)。
我的做法是:
- 將字典展平并將其變成元組串列,
- 重建字典并使用映射串列交換鍵。
我能夠做到#1,我正在為#2 尋找一個好的解決方案。一般來說,我希望解決方案盡可能通用。
具體案例
我有一個 N 到 N-1 級嵌套字典,其中前三個級別需要在給定映射的情況下交換。我的字典的一部分看起來像這樣:
raw_dict = {'a':{'b':{'c':[1,2,3]}},
'd':{'e':{'f':{'g':[4,5,6]}}}}
我設法將原始字典展平為具有遞回的元組串列,即使用以下函式
def unnest(d, keys=[]):
'''
convert a dictionary to a (ordered) list of tuples
input: dictionary
output: list of tuples
'''
lt = []
for k, v in d.items():
if isinstance(v, dict):
lt.extend(unnest(v, keys [k]))
else:
lt.append(tuple(keys [k, v]))
return lt
現在,我有一個長度不同的元組串列,但最長的元素總是比最短的元素長 1 個元素(基本上每個元組都有 N 或 N-1 個元素)。從上面raw_dict的例子中,得到的元組串列是這樣的
reform_list = [('a','b','c',[1,2,3]),('d','e','f','g',[4,5,6])]
其中第一個長度為 4 (N-1),第二個長度為 5 (N)。
我想達到什么...
...是構建一個基于元組構建嵌套字典的函式,無論長度如何,但基于如下映射:
my_map = [2,1,0,3]
該功能將類似于
def nest(my_tuple,my_map):
[do something]
return my_dict
我會像這樣在回圈中呼叫函式
for t in reform_list:
n_d = nest(t,my_map)
print(n_d)
回圈的預期結果是:
{'c':{'b':{'a':[1,2,3]}}}
{'f':{'e':{'d':{'g':[4,5,6]}}}}
在最后一步...
...我將通過使用以下函式從“想要”函式中生成的單個字典開始,通過更新它來構建交換字典,無論深度如何
def update(d, u):
'''
update nested dictionary
input: dict to update (d), update to use (u)
output: updated dict (d)
'''
for k, v in u.items():
if isinstance(v, collections.abc.Mapping):
d[k] = update(d.get(k, {}), v)
else:
d[k] = v
return d
uj5u.com熱心網友回復:
您可以使用遞回:
reform_list = [('a','b','c',[1,2,3]),('d','e','f','g',[4,5,6])]
my_map = [2,1,0,3]
def build_dict(mp, val):
if not mp or len(val) - 1 <= mp[0]:
return val[-1]
return {val[mp[0]]:build_dict(mp[1:],val)}
results = [build_dict(my_map, i) for i in reform_list]
輸出:
[{'c': {'b': {'a': [1, 2, 3]}}}, {'f': {'e': {'d': {'g': [4, 5, 6]}}}}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477322.html
