2017-02-21 3 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

Вы могли бы использовать вложенный словарь. Таким образом, вы можете вставить отчет в соответствующее место в иерархии. Корень будет иметь как Тома Лас, так и Майк Море под ним непосредственно –

+0

Интервьюер, похоже, не знает, что означает «прямой отчет». – tdelaney

ответ

1

Построить дерево ... Я изменил «прямые сообщения» на «менеджер», так как я думаю, дело в том, чтобы назвать менеджеру данного лица в MemberInfo объекта. Обратная связь менеджера - это список прямых отчетов, поэтому я устанавливаю в приведенном ниже примере. Я начал с индексирования списка, добавил список "direct reports" и заполнил этот список. Тогда речь шла только о рекурсивной рутине, которая бы печатала и записывала, за которой следовали любые прямые отчеты. Код не делает никаких предположений о том, как раздувается организация, но предполагает, что в списке нет циклов ... Я как-то сообщал себе о работе, которую я имел, и что играл хаос со всеми видами программного обеспечения. Интересно, что я работал над кодом, который управлял 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) 
+0

Красивая! древовидная структура более гибкая, и отступ в формате настолько удобен! – user3768947

Смежные вопросы