2016-10-11 40 views
0

我有一個輸入文件,格式如下。試圖從列表中構建組織樹

Fred,Karl,Technician,2010--Karl,Cathy,VP,2009--Cathy,NULL,CEO,2007-- 
--Vince,Cathy,Technician,2010 

我需要解析這些信息到它結束了看起來像這樣的一個輸出文件:

Cathy (CEO) 2007 
-Karl (VP) 2009 
--Fred (Technician) 2010 
-Vince (Technician) 2010 

在頂部的CEO,每個下屬應當根據自己的優越。所以不管第二個名字是什麼,那就是主管。訣竅是,如果一名員工有兩名主管,他們需要兩次縮進「 - 」與他們的直屬主管。

我已經嘗試遍歷列表並解析通過「 - 」和逗號,但我正在努力與結構本身。這是我迄今爲止所擁有的。

with open('org_chart_sample.in', 'r') as reader: # Open the input file 
with open('output.out', 'w') as writer: # Make output file writable 
    reader.readline() # Ignore first line 
    lines = reader.readlines() # Read input lines 

    for line in lines:  # Parse out input by the -- which separated attributes of people in the org 
     employees = line.split('--') 
     hierarchy = []  # Exterior list to aid in hierarchy 

     for employee in employees: # Logic that adds to the hierarchy list as algorithm runs 
      info = employee.split(',') 
      hierarchy.append(info) 

我一直停留在這個問題上不再是那個喜歡我承認:(

+0

你能完成這個例子嗎? nancy和bob合適? – mitoRibo

+0

我的歉意@rbierman,我修正了這個例子 – ozbrancov

回答

0

酷的問題,很好玩的去努力。我試圖徹底,它結束了讓那種長,我希望它仍然可讀

代碼:

########################## 
#Input data cleaned a bit# 
########################## 
lines = ["Fred,Karl,Technician,2010", 
     "Karl,Cathy,VP,2009", 
     "Cathy,NULL,CEO,2007", 
     "Vince,Cathy,Technician,2010", 
     "Mary,NULL,CEO,2010", 
     "Steve,Mary,IT,2013"] 

################################## 
#Worker class to make things neat# 
################################## 
class Worker(object): 
    #Variables assigned to this worker 
    __slots__ = ["name","boss","job","year","employees","level"] 

    #Initialize this worker with a string in the form of: 
    #"name,boss,job,year" 
    def __init__(self,line): 
     self.name,self.boss,self.job,self.year = line.split(",") 
     self.level = 0 if self.boss == "NULL" else -1 #If boss is NULL, they are '0' level 
     self.employees = [] 

    #A function to add another worker as this worker's employee 
    def employ(self,worker): 
     worker.level = self.level+1 
     self.employees.append(worker) 

    #This is a recursive function which returns a string of this worker 
    #and all of this workers employees (depth first) 
    def __repr__(self): 
     rep_str = "" 
     rep_str += "-"*self.level 
     rep_str += str(self.name)+" works for "+str(self.boss) 
     rep_str += " as a "+str(self.job)+" since "+str(self.year)+"\n" 
     for employee in self.employees: 
      rep_str += str(employee) 
     return rep_str 

######################################## 
#Prepare to assign the bosses employees# 
######################################## 
#1. Turn all of the lines into worker objects 
workers = [Worker(line) for line in lines] 

#2. Start from the top level bosses (the ones that had NULL as boss) 
boss_level = 0 

#3. Get a list of all the workers that have a boss_level of 0 
bosses = [w for w in workers if w.level == boss_level] 

#While there are still boses looking to employ then keep going 
while len(bosses) > 0: 
    #For each boss look through all the workers and see if they work for this boss 
    #If they do, employ that worker to the boss 
    for boss in bosses: 
     for worker in workers: 
      if worker.level == -1 and boss.name == worker.boss: 
       boss.employ(worker) 

    #Move down a tier of management to sub-bosses 
    #If there are no sub-bosses at this level, then stop, otherwise while loop again 
    boss_level += 1 
    bosses = [w for w in workers if w.level == boss_level] 

########################## 
#Printing out the workers# 
########################## 
#1. Loop through the top bosses and 
# print out them and all their workers 
top_bosses = [w for w in workers if w.level == 0] 
for top_boss in top_bosses: 
    print top_boss 

輸出:

Cathy works for NULL as a CEO since 2007 
-Karl works for Cathy as a VP since 2009 
--Fred works for Karl as a Technician since 2010 
-Vince works for Cathy as a Technician since 2010 

Mary works for NULL as a CEO since 2010 
-Steve works for Mary as a IT since 2013 
+0

謝謝!這是一個很好的解決方案! – ozbrancov