【问题标题】:Extract set of values from nested dictionaries/lists Python从嵌套字典/列表Python中提取一组值
【发布时间】:2015-11-28 10:15:27
【问题描述】:

我有一本字典 teacher,其中包含字典的嵌套列表。我正在尝试使用递归函数为 Joe Bloggs 的所有同事和同事的同事提取名称的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):

【问题讨论】:

    标签: python dictionary recursion


    【解决方案1】:

    你可以在集合推导中做到这一点;该循环包括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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多