Python 从嵌套的字典/列表中提取一组值
我有一本字典Python 从嵌套的字典/列表中提取一组值,python,dictionary,recursion,Python,Dictionary,Recursion,我有一本字典teacher,其中包含嵌套的字典列表。我正在尝试使用递归函数为Joe Bloggs的所有同事和同事提取一组名称 teacher = {'age': 27, 'name': 'Joe Bloggs', 'colleagues': [{'age': 34, 'name': 'Tim Smith', 'colleagues': [{'age': 39,
teacher
,其中包含嵌套的字典列表。我正在尝试使用递归函数为Joe Bloggs的所有同事和同事提取一组名称
teacher = {'age': 27,
'name': 'Joe Bloggs',
'colleagues': [{'age': 34,
'name': 'Tim Smith',
'colleagues': [{'age': 39,
'name': 'Linda Smith',
'colleagues': [{'age': 41,
'name': 'Belinda Barker',
'colleagues': []}]},
{'age': 33,
'name': 'Kelly Brooker',
'colleagues': []},
{'age': 44,
'name': 'Duncan Turnbull',
'colleagues': []}]},
{'age': 29,
'name': 'Jenna French',
'colleagues': []}]}
所需输出:
{'Tim Smith', 'Linda Smith', 'Belinda Barker',
'Kelly Brooker', 'Duncan Turnbull', 'Jenna French'}
注意:输出不需要按任何特定顺序,因为它是一个集合
。与递归函数通常的情况一样,在没有实际找到解决方案的情况下很难“取得进展”。到目前为止,我有一个递归函数,它接受两个参数,但不知道如何设置我的函数以生成所需的结果:
def names(teacher, colleagues=None):
你可以在一套理解中做到这一点;循环包括
同事
列表中的所有姓名及其递归同事姓名:
def names(teacher):
return {name for c in teacher['colleagues'] for name in {c['name']} | names(c)}
您还可以将其表示为一组直接名称和递归调用的并集:
def names(teacher):
direct = {c['name'] for c in teacher['colleagues']}
return direct.union(*(names(c) for c in teacher['colleagues']))
演示:
>>> def names(teacher):
... return {name for c in teacher['colleagues'] for name in {c['name']} | names(c)}
...
>>> names(teacher)
{'Tim Smith', 'Belinda Barker', 'Kelly Brooker', 'Duncan Turnbull', 'Jenna French', 'Linda Smith'}
>>> def names(teacher):
... direct = {c['name'] for c in teacher['colleagues']}
... return direct.union(*(names(c) for c in teacher['colleagues']))
...
>>> names(teacher)
{'Tim Smith', 'Belinda Barker', 'Linda Smith', 'Kelly Brooker', 'Duncan Turnbull', 'Jenna French'}