我有一個結構相當復雜的 Python 字典——多層嵌套值,其中一些是 dicts,其中一些是串列。我想以一種可以輕松應用的緊湊方式表示對資料的更改。
對于僅字典的值,這似乎并不太難——您可以制作一個反映主要資料結構但僅包括其父項上修改過的鍵的 dict,并呼叫一個稍微修改過的 .update() 來檢測墓碑值以防您需要完全洗掉密鑰。
但是涉及到串列,它似乎變得更加棘手。似乎我需要提出某種需要考慮很多情況的自定義尋址方案 - 你不能天真地使用串列索引作為鍵,因為你需要支持例如洗掉元素 5同時作為元素 2 和 3 之間的插入。
此外,如果串列不限于葉子,那么在指定對串列中包含的專案進行更改的同時還要修改該串列的元素是很棘手的。
是否有一個 Python 庫可以標準化這樣的東西?還是一種相對健全的標準演算法/方法?
作為參考,這是一個實作我正在尋找的僅dict資料的函式:
def update(d, u):
for k, v in u.items():
if v == 'del':
del d[k]
elif isinstance(v, collections.abc.Mapping):
d[k] = update(d.get(k, {}), v)
else:
d[k] = v
return d
>>> d = {1: 2, 3: {4: 5, 6: 7}}
>>> delta = {3: {4: 'del', 6: 8}, 9: 10}
>>> update(d, delta)
{1: 2, 3: {6: 8}, 9: 10}
uj5u.com熱心網友回復:
從用戶的角度來看,我認為串列索引并不像您所說的那樣嚴重。只有在完成所有操作后,索引才會發生變化。在串列操作期間使用舊索引。
從實作的角度來看,我們在操作串列索引時必須非常小心。我們可以做的是i通過迭代維護一個“索引增量”,而不是修改l[k],我們修改l[k i].
在這里,我將使用一個字典作為增量,以串列索引作為鍵,以及這三個可能的值:
'del'洗掉該索引處的專案;('insert', v)在該索引之前插入值 v;和v將值修改v為該索引處的值。
請注意,'del'andv是互斥的,但'insert'可以累積:可以在同一索引處插入多個元素,并且可以在索引之前插入元素并洗掉或修改該索引處的元素。我們希望我們的 dict delta 能夠將一個鍵映射到多個更新;即,將鍵映射到串列。
from operator import itemgetter
def update(d, u):
if isinstance(d, dict):
return update_dict(d, u)
elif isinstance(d, list):
return update_list(d, u)
def update_dict(d, u):
for k, v in u.items():
if v == 'del':
del d[k]
elif isinstance(v, dict):
d[k] = update(d.get(k, {}), v)
else:
d[k] = v
return d
def update_list(d, u):
i = 0
for k, v in sorted(u.items(), key=itemgetter(0)):
if isinstance(v, list):
for x in v:
i = update_list_once(d, i, k, x)
else:
i = update_list_once(d, i, k, v)
return d
def update_list_once(d, i, k, v):
if v == 'del':
del d[k i]
i -= 1
elif isinstance(v, tuple) and len(v) == 2 and v[0] == 'insert':
d.insert(k i, v[1])
i = 1
else:
if isinstance(v, dict):
d[k i] = update(d[k i], v)
else:
d[k i] = v
return i
測驗:
d = {1: 2, 3: {4: [0, 1, 2, 3, 4, 5], 6: 7}}
delta = {3: {4: {0: 'fizzbuzz', 3: 'fizz', 4: [('insert', 3.5), 4.001], 5: 'buzz'}, 6: 8}, 9: 10}
d = update(d, delta)
print(d)
# {1: 2, 3: {4: ['fizzbuzz', 1, 2, 'fizz', 3.5, 4.001, 'buzz'], 6: 8}, 9: 10}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478412.html
上一篇:C 中的斐波那契數溢位
