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