2017-03-03 87 views
0

我需要讀取多個文件中的行;每行中的第一個值是運行時,第三個是作業ID,第四個是狀態。我創建了列表來存儲每個這些值。現在我不知道如何連接所有這些列表,並根據前20個運行時間最快的行對它們進行排序。有人對我如何做到這一點有什麼建議嗎?謝謝!你如何結合python中的三個列表使用字典?

for filePath in glob.glob(os.path.join(path1, '*.gz')): 
    with gzip.open(filePath, 'rt', newline="") as file: 
     reader = csv.reader(file) 
     for line in file: 
      for row in reader: 
       runTime = row[0] 
       ID = row[2] 
       eventType = row[3] 
       jobList.append(ID) 
       timeList.append(runTime) 
       eventList.append(eventType) 

    jobList = sorted(set(jobList)) 
    counter = len(jobList) 
    print ("There are %s unique jobs." % (counter)) 
    i = 1 
    while i < 21: 
     print("#%s\t%s\t%s\t%s" % (i, timeList[i], jobList[i], eventList[i])) 
     i = i + 1 
+1

只是一個樣式註釋 - 使用諸如'run_time'和'event_type'這樣的名稱而不是'runTime'和'eventType'更加pythonic。 – dmlicht

回答

1

而不是使用三種不同的列表,你可以使用一個單獨的列表,並附加元組到list..Like所以

combinedList.append((runTime, ID, eventType)) 

然後可以排序的元組combinedList如下所示:How to sort (list/tuple) of lists/tuples?

你可以讓更多的改進,如在Python中使用namedtuples等找一找在SO或谷歌

注意:可能有其他「有效」的方法來做到這一點。例如,使用python heapq庫,並創建一個大小爲20的堆,按前20個運行時間進行排序。您可以瞭解他們對Python的網站或堆棧溢出,但你可能需要一些更多的算法背景

+0

好的,我明白,但是如果我要爲此創建一本字典,我該如何對它們進行排序,以便僅打印前20個最長的運行時間作業?我想我要問的是如何通過該值對字典進行排序 – Liz

+0

基本上,您將以ID和值的形式存儲關鍵字(runTime,eventType)。然後按照如下所示的方式按最長的運行時排序:http: //stackoverflow.com/questions/7349646/sorting-a-dictionary-of-tuples-in-python – labheshr

0

而是維持三個列表jobListtimeListeventList,你可以存儲(runTime, eventType)元組在字典中,使用ID爲重點的,由更換

jobList = [] 
timeList = [] 
eventList = [] 
… 
jobList.append(ID) 
timeList.append(runTime) 
eventList.append(eventType) 

通過

jobs = {} # an empty dictionary 
… 
jobs[ID] = (runTime, eventType) 

要遍歷該字典,通過增加排序210個值:如果您在數據結構中保持runTimeIDeventType一起

for ID, (runTime, eventType) in sorted(jobs.items(), key=lambda item: item[1][0]): 
    # do something with it 
0

使用內置在Python sorted會工作更好地爲您。我建議使用namedtuple,因爲它可以讓你清楚你在做什麼。你可以做到以下幾點:

from collections import namedtuple 
Job = namedtuple("Job", "runtime id event_type") 

那麼你的代碼可以改變爲:

for filePath in glob.glob(os.path.join(path1, '*.gz')): 
    with gzip.open(filePath, 'rt', newline="") as file: 
     reader = csv.reader(file) 
     for line in file: 
      for row in reader: 
       runTime = row[0] 
       ID = row[2] 
       eventType = row[3] 
       job = Job(runTime, ID, eventType) 
       jobs.append(job) 

    jobs = sorted(jobs) 
    n_jobs = len(jobs) 
    print("There are %s unique jobs." % (n_jobs)) 
    for job in jobs[:20]: 
     print("#%s\t%s\t%s\t%s" % (i, job.runtime, job.id, job.event_type)) 

值得一提的,這個排序,會因爲默認情況下正常工作,元組是由他們的第一個元素進行排序。如果有一條平局,你的排序算法會將比較移動到元組的下一個元素。

相關問題