2017-04-26 3 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() 

データファイルでは、タプルを作成し、タプルをリストに格納し、リストをソートし、オーバーラップするタプルの各ペアを1つのタプルに置き換える必要がありました。交差していないタプルのリストを印刷します。間隔のサイズの大きい順に非交差の間隔を印刷するにはどうすればよいですか?

しかし、ここでは、交差していない間隔を間隔のサイズの大きい順に印刷する方法を知りたいと思います。 2つの間隔が同じサイズの場合、下端の昇順に2つの間隔を印刷します。 ( :

非交差区間: (-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

興味深い。それは約1日前の質問と同じ間隔です。 – Vallentin

+0

問題の最初の部分は同じです。しかし、交差しない区間をどのようにサイズ順に並べるかを知りたい。私はすでに持っているout_putを取って、各範囲ごとに別々のリストを作成し、リストの長さを数えますか?それを昇順で印刷しますか? – BingBing23

答えて

0

考える:

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

を次にあなたはすでにソートされてきたように、あなただけのサイズに基づいて、それを並べ替えます。そしてprint(intervals)出力

# 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])) 

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

したがって(-4, 3), (4, 7), (-2, 1)与えられ、それは(サイズは3, 3, 7ある)(-2, 1), (4, 7), (-4, 3)になります。それで、それは、より小さいサイズに基づいて正しくソートされます。

+0

正しい形式で印刷することができません。 – BingBing23

+0

私は、合併された間隔を印刷しようとするたびにforループを使用して、矛盾したタブエラーが発生しました – BingBing23

+0

それは本当に説明的な問題ではありません。もちろん、あなたは 'mergeoverlapping'関数の代わりに上記を使うべきです。 – Vallentin

関連する問題