假設我有以下字典:
{
'a1': {'b1': {'c1': 'val'}, 'b2': { 'c2': { 'd2': 'terminal'} } },
'a2': {'b2': 'val'}
}
我的目標是檢索串列中的所有鍵:
'a1', 'b1', 'c1', 'b2', 'c2', 'd2', 'a2', 'b2'
但同時也要保留它們在字典中的位置,如下所示:
'a1', 'a1.b1', 'a1.b1.c1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a2', 'a2.b2'
這在 Python 中是可能的嗎
uj5u.com熱心網友回復:
一種方法是使用遞回生成器函式:
data = {
'a1': {'b1': {'c1': 'val'}, 'b2': {'c2': {'d2': 'terminal'}}},
'a2': {'b2': 'val'}
}
def nested_iter(d, root=""):
for key, value in d.items():
printable = f"{root}.{key}" if root else key
if isinstance(value, dict):
yield printable
yield from nested_iter(value, root=printable)
else:
yield printable
print(list(nested_iter(data)))
輸出
['a1', 'a1.b1', 'a1.b1.c1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a2', 'a2.b2']
作為替代,您可以collections.deque用來處理遞回:
def nested_iter_with_deque(d):
from collections import deque
result = []
q = deque(d.items())
while q:
k, vs = q.popleft()
result.append(k)
if isinstance(vs, dict):
lst = [(f"{k}.{key}", value) for key, value in vs.items()]
if lst:
q.extendleft(deque(lst))
return result
print(nested_iter_with_deque(data))
輸出
['a1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a1.b1', 'a1.b1.c1', 'a2', 'a2.b2']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334491.html
上一篇:字典串列中給定鍵的訪問值
