Python优化数据结构

Python优化数据结构,python,data-structures,Python,Data Structures,我在解决问题的面试中失败了。他们提供了一个json对象: { "UserName": "Tom Las", "title": "Director" }, { "UserName": "Mike Sea", "title": "senior manager" }, { "UserName": "Jojo Lee", "title": "manager", "direct Report": "Mike Sea" }, { "UserNa

我在解决问题的面试中失败了。他们提供了一个json对象:

{
    "UserName": "Tom Las",
    "title": "Director"
},
{
    "UserName": "Mike Sea",
    "title": "senior manager"
},
{
    "UserName": "Jojo Lee",
    "title": "manager",
    "direct Report": "Mike Sea"
},
{
    "UserName": "Luke Shi",
    "title": "manager",
    "direct Report": "Mike Sea"
},
{
    "UserName": "Bob Aeo",
    "title": "engineer",
    "direct Report": "Luke Shi"
},
{
    "UserName": "Zobu hu",
    "title": "engineer",
    "direct Report": "Tom Las"
}
需要组织结构的格式化输出,如:

Mike Sea - senior manager
  Jojo Lee
  Luke Shi
    Bob Aeo
Tom Las - Director
  Zobu hu
这是我的解决方案。我使用两个字典跟踪领导和团队成员信息,并使用“*n”在子团队中缩进团队成员。我觉得下面的代码很笨拙,并且不能灵活地显示更多级别的子团队,例如,如果“Bob Aeo”下面还有团队成员。在这种情况下,我应该考虑不同的数据结构,而不是字典吗?谢谢

#!/usr/bin/env python

from collections import defaultdict

MemberInfo = [
    {
        "UserName": "Tom Las",
        "title": "Director"
    },
    {
        "UserName": "Mike Sea",
        "title": "senior manager"
    },
    {
        "UserName": "Jojo Lee",
        "title": "manager",
        "direct Report": "Mike Sea"
    },
    {
        "UserName": "Luke Shi",
        "title": "manager",
        "direct Report": "Mike Sea"
    },
    {
        "UserName": "Bob Aeo",
        "title": "engineer",
        "direct Report": "Luke Shi"
    },
    {
        "UserName": "Zobu hu",
        "title": "engineer",
        "direct Report": "Tom Las"
    }
]

Leader={}
Team=defaultdict(list)

for line in MemberInfo:
    if "direct Report" not in line and line['UserName'] not in Leader:
        Leader[line['UserName']] = line['title']
    elif line['direct Report']:
        Team[line['direct Report']].append(line['UserName'])

for key,value in Leader.iteritems():
    print("{} - {}".format(key,value))
    for Member in Team[key]:
        if Member in Team:
            print("  {}".format(Member))
            print(" "*4 + ' '.join(Team[Member]))
        else:
            print("  {}".format(Member))
建一棵树。。。我将“直接下属”改为“经理”,因为我认为关键是在
MemberInfo
对象中命名此人的经理。经理的反向链接是一个直接下属列表,这就是我在下面的示例中设置的。我从索引列表开始,添加了一个“直接下属”列表,然后填写该列表。然后,这只是一个递归例程的问题,该例程将打印和输入任何直接报告。代码没有假设组织有多臃肿,但是假设列表中没有循环。。。我曾经在一份工作中向自己汇报,那份工作对各种软件都造成了极大的破坏。有趣的是,当时我正在编写管理Active Directory
Manager
directReports
字段的代码

MemberInfo = [
    {
        "UserName": "Tom Las",
        "title": "Director"
    },
    {
        "UserName": "Mike Sea",
        "title": "senior manager"
    },
    {
        "UserName": "Jojo Lee",
        "title": "manager",
        "Manager": "Mike Sea"
    },
    {
        "UserName": "Luke Shi",
        "title": "manager",
        "Manager": "Mike Sea"
    },
    {
        "UserName": "Bob Aeo",
        "title": "engineer",
        "Manager": "Luke Shi"
    },
    {
        "UserName": "Zobu hu",
        "title": "engineer",
        "Manager": "Tom Las"
    }
]

def crawl_ranks(name, indent=''):
    """Prints member and direct report names recursively"""
    member = member_index[name]
    print('{}{}'.format(indent, member['UserName']))
    for name in sorted(member.get('direct reports', [])):
        crawl_ranks(name, indent=indent + '  ')

# index by name for easy lookup
member_index = {member['UserName']:member for member in MemberInfo}

# add direct reports list to member info
for member in MemberInfo:
    member['direct reports'] = []

# add dummy index entry for bossless persons
member_index[None] = {'direct reports':[]}

# add member name to boss's direct reports list
for member in MemberInfo:
    member_index[member.get('Manager')]['direct reports'].append(member['UserName'])

# print, starting with top-level managers
for name in sorted(member_index[None]['direct reports']):
    crawl_ranks(name)

树呢?你可以用嵌套字典。这样你就可以在继承权的适当位置插入一份报告。“根”下面会有汤姆·拉斯和迈克·海。面试官似乎不知道“直接报告”是什么意思。@t德莱尼,那是我的错。我记不起他们使用的确切关键词了。漂亮!树形结构更加灵活,缩进格式非常方便!!