2017-02-21 135 views
-2

我在面试问题解决中失败了。他们提出一个JSON对象:Python优化数据结构

{ 
    "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”也有他的团队成员。在这种情况下,我应该考虑不同的数据结构而不是字典吗?谢谢!

+0

那么树呢? – Julien

+0

你可以使用嵌套字典。这样你就可以在报告的适当位置插入一份报告。根目录将直接在它下面有Tom Las和Mike Sea –

+0

面试官似乎不知道“直接报告”的含义。 – tdelaney

回答

1

建立了一棵树......我改变“直接报告”,以“经理”,因为我认为这一点是命名人的经理在MemberInfo对象。经理的反向链接是直接报告的列表,这就是我在下面的例子中设置的内容。我开始索引列表,添加一个"direct reports"列表,然后填写该列表。然后,这只是一个递归例程的问题,可以打印和输入任何直接报告。代码没有假设组织有多么臃肿,但确实假设列表中没有循环......我曾经向我自己报告过自己的工作,并且对各种软件都造成严重破坏。有趣的是,我当时正在研究管理Active Directory ManagerdirectReports字段的代码。

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) 
+0

美丽!树形结构更加灵活方便,并且格式缩进非常方便! – user3768947