2017-04-26 28 views
0
def mergeoverlapping(initialranges): 
    i = sorted(set([tuple(sorted(x)) for x in initialranges])) 

    f = [i[0]] 
    for c, d in i[1:]: 
     a, b = f[-1] 
     if c<=b<d: 
      f[-1] = a, d 
     elif b<c<d: 
      f.append((c,d)) 
     else: 
      pass 
    return f 

def main(): 
    #open file for reading 
    list_of_Tups = [] 
    with open("intervals.txt") as in_file: 
     for line in in_file: 
      int_list = [int(i) for i in line.split()] 
      line = int_list 
      list_of_Tups.append(line) 
      list_of_Tups.sort() 

    answer = list(mergeoverlapping(list_of_Tups)) 
    print("Non-intersecting Intervals:") 
    for i in range (len(answer)): 
     print(answer[i]) 

main() 

給定一個數據文件,我必須創建元組,將元組存儲在列表中,對列表進行排序,並用一個元組替換每對重疊的元組。然後打印非相交元組的列表。如何按照間隔大小的遞增順序打印非交叉間隔?

但是現在我想知道如何以間隔大小的遞增順序打印非相交間隔。如果兩個間隔的大小相同,則以低端的升序打印這兩個間隔。因此,輸出將類似於:

不相交的時間間隔: (-4,3) (4,7) (10,15)

非交叉間隔大小順序: ( 4,7) (10,15) (-4,3)

+0

可能重複的[合併重疊間隔python](http://stackoverflow.com/questions/43600878/merging-overlapping-intervals-python) – Vallentin

+0

有趣。甚至與大約一天前的問題相同。 – Vallentin

+0

問題的第一部分是相同的。但我想知道如何將非交叉區間按大小排序。我是否已經擁有了out_put,然後爲每個範圍創建單獨的列表,計算列表的長度。然後按升序打印? – BingBing23

回答

0

考慮:

intervals = [(-25, -14), (-10, -3), (2, 6), (12, 18), (22, 30)] 

然後像你已經去過排序,你只是排序它的基礎上的大小。

# First sort in ascending order in relation to lower 
intervals.sort(key=lambda interval: interval[0]) 

# Then sort in ascending order in relation to size 
intervals.sort(key=lambda interval: abs(interval[0] - interval[1])) 

然後print(intervals)輸出:

[(2, 6), (12, 18), (-10, -3), (22, 30), (-25, -14)] 

因此給出(-4, 3), (4, 7), (-2, 1)然後它導致(-2, 1), (4, 7), (-4, 3)(大小爲3, 3, 7)。所以它正確分類的基礎上,然後大小。

+0

現在我無法使用正確的格式打印它。 – BingBing23

+0

因爲我使用for循環來打印合並的間隔,每當我嘗試打印有序的間隔太多,我得到不一致的選項卡錯誤 – BingBing23

+0

這不是一個真正的描述性問題。你當然應該使用上述代替你的'mergeoverlapping'函數。 – Vallentin