2013-05-08 59 views
2

我剛剛閱讀了發電機,並想知道如何使用發電機在此:
說有兩個文件,每個文件有一個時間列。每個文件都按照時間順序排序,並且我正在使用時間優先級來抓取這些文件中的行。我想知道創建一個next()生成器是一種更好還是更合適的方式來按時間優先級讀取這兩個文件,而不是寫一個簡潔的表達式(請參見下文)。使用發電機讀取兩個文件的時間優先

for line1 in file1:  
    do_something 
    try: 
     if time1<time2: 
      do_something  
      continue 
     else: 
      do_something 
    except: 
     pass 
    for line2 in file2: 
     do_something 
     if time2>time1: 
      break 

回答

10

使用heapq.merge

def generate_timeline(file): 
    for line in file: 
     time1 = extract_time_from_line(line) 
     yield time1, line 


for (time1, line) in heapq.merge(generate_timeline(file1), generate_timeline(file2)): 
    process(line) 
+0

謝謝,這是非常有益的,更快! – FancyDolphin 2013-05-08 17:20:07

+0

我有一個快速跟進:說for循環之前,我有一個while循環是:while time> time1。如果兩個文件都在這個條件滿足之前結束,我希望它退出循環。我將如何讓發電機做到這一點。它看起來並不像在發生器中放置收益None一樣簡單。 – FancyDolphin 2013-05-19 14:51:54

+0

@FancyDolphin,'在生成器中提升GeneratorExit' – iruvar 2013-05-19 14:54:14