2017-02-21 20 views
-2

インタビューの問題解決に失敗しました。彼らは、JSONオブジェクトを提示:Python最適化データ構造

Mike Sea - senior manager 
    Jojo Lee 
    Luke Shi 
    Bob Aeo 
Tom Las - Director 
    Zobu hu 

ここに私のソリューションです:

{ 
    "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" 
} 

のような組織構造のフォーマットされた出力が必要。私はリーダーとチームメンバーの情報を追跡するために2つの辞書を使い、サブチームのチームメンバーをインデントするために "" * nを使います。私は下のコードが下位チームのより多くのレベルを示すために不器用で柔軟ではないと感じています。たとえば、「Bob Aeo」にもチームメンバーがいるとします。この場合、辞書の代わりに別のデータ構造を考慮する必要がありますか?ありがとう!

+0

ツリーについてはどうですか? – Julien

+0

ネストされた辞書を使用できました。そうすれば、階層内の適切な場所にレポートを挿入することができます。根はトム・ラスとマイク・シーの両方を直接下に置くだろう –

+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

関連する問題