Python优化数据结构
我在解决问题的面试中失败了。他们提供了一个json对象: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
{
"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 DirectoryManager
和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德莱尼,那是我的错。我记不起他们使用的确切关键词了。漂亮!树形结构更加灵活,缩进格式非常方便!!