从嵌套的字典/列表中提取一组值

2024-04-19 19:47:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典teacher,其中包含嵌套的字典列表。我正在尝试使用递归函数为joebloggs的所有同事和同事提取名称的set。你知道吗

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'}

注意输出不需要任何特定的顺序,因为它是set。与递归函数的常见情况一样,在没有找到解决方案的情况下很难“取得进展”。到目前为止,我有一个递归函数,它接受两个参数,但不知道如何设置我的函数来生成所需的结果:

def names(teacher, colleagues=None):

Tags: nameage字典smithtimsetteacher同事
1条回答
网友
1楼 · 发布于 2024-04-19 19:47:59

您可以在集合理解中执行此操作;循环包括colleagues列表中的所有名称及其递归同事名称:

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'}

相关问题 更多 >