[英]Python iterating through nested dictionaries
首先,這里是問題和編寫的代碼:
def family_lineage(familytree, lineage):
'''(dict, list of strs) -> boolean
Return True if lineage specifies a list of names who are directly related
in a chain of parent-child relationships, and NOT child-parent, parent-grandchild..etc,
beginning from the first generation listed.
>>> trace_lineage({'Gina': {'Sam': {'Tina': {}},
'Li': {}},
'Guy': {}},
['Gina'])
True
>>> trace_lineage({'Gina': {'Sam': {'Tina': {}},
'Li': {}},
'Guy': {}},
['Gina', 'Sam', 'Tina'])
True
>>> trace_lineage({'Gina': {'Sam': {'Tina': {}},
'Li': {}},
'Guy': {}},
['Gina', 'Tina'])
False
'''
因此,在上面的示例中,它顯示“ Guy”沒有孩子,而“ Gina”有兩個孩子“ Sam”和“ Li”。 “山姆”有一個孩子“蒂娜”。
for k, v in familytree.items():
for n, m in v.items():
if lineage[0] == any(k) and len(lineage) == 1:
return True
elif lineage[0] == k and lineage[1] == n and len(lineage) ==2:
return True
elif lineage[0] == k and lineage[1] == n and lineage[2] == m and \
len(lineage) == 3:
return True
else:
return False
因此,我的問題是,如果家族樹擴展到三代以上,我將如何寫呢? 有沒有更簡潔的代碼編寫方式?
這是一種迭代方法,即使lineage
不是從家族樹的頂部開始,也可以使用:
def family_lineage(familytree, lineage):
trees = [familytree]
while trees:
tree = trees.pop()
trees.extend(t for t in tree.values() if t)
for name in lineage:
if name not in tree:
break
tree = tree[name]
else:
return True
return False
基本上,您想看看是否可以遍歷樹。 使用reduce()
遍歷元素,如果引發KeyError
,則該路徑不存在:
def family_lineage(familytree, lineage):
if not familytree:
return False
try:
reduce(lambda d, k: d[k], lineage, familytree)
return True
except KeyError:
# No match at this level, recurse down the family tree
return any(family_lineage(val, lineage) for val in familytree.itervalues())
reduce()
從familytree
開始,遞歸地將lambda
函數應用於lineage
。
為了支持尋找更深層次的譜系樹倒,則需要向下遞歸在樹上KeyError
秒。
演示:
>>> tree = {'Gina': {'Sam': {'Tina': {}}, 'Li': {}}, 'Guy': {}}
>>> family_lineage(tree, ['Gina'])
True
>>> family_lineage(tree, ['Gina', 'Sam', 'Tina'])
True
>>> family_lineage(tree, ['Gina', 'Tina'])
False
>>> family_lineage(tree, ['Sam', 'Tina'])
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.