2017-01-02 5 views
0

間boundry範囲の重複を取り除くためにどのように私は、その内部に、このようなファイルがあります:パイソン - ライン

1 33725 36725 ENHANCER0002 1 711760 714760 ENHANCER0003 1 724150 727150 ENHANCER0004 1 725455 728455 ENHANCER0005 1 871280 874410 ENHANCER0006 1 874180 877180 ENHANCER0007 1 900540 903540 ENHANCER0008 1 901475 904475 ENHANCER0009 1 910260 913260 ENHANCER00010 1 933355 936355 ENHANCER00011 1 947660 950660 ENHANCER00012 1 1013530 1016530 ENHANCER00013 . . . 1 2477030 2480030 ENHANCER00043 1 2478160 2481160 ENHANCER00044 1 2478845 2481845 ENHANCER00045

真ん中の2つの列が私の下限と上限境界であるが。ライン3-4またはライン5-6と同様に、境界は重なり合う。境界線が重なると、最も低い境界線と最も高い境界線のみが印刷されます。私はこのようなソリューションのためのPythonでの作業とここに私のコードでいます:

def write_line(chr_no,tmp_l,tmp_h,cnt,filename): 
    filename.write(str(chr_no)+"\t"+str(tmp_l)+"\t"+str(tmp_h)+"\t"+"ENHANCER000"+str(cnt)+"\n") 


inf = open("/home/firat/Desktop/Onder_Lab/Kenan/enhancers_bj.bed","r") 
outf = open("/home/firat/Desktop/deneme_v3.bed","w") 

cnt = 0 
tmp_l=0 
tmp_h=0 

tmp_list = [] 

for line in inf: 
    cnt += 1 
    line = line.split(' ') 
    current_low = line[1] 
    current_high = line[2] 
    previous_low = tmp_l 
    previous_high = tmp_h 
    if (int(current_low) <= int(previous_high)): 
     tmp_list.append(int(current_low)) 
     tmp_list.append(int(current_high)) 
     tmp_list.append(int(previous_low)) 
     tmp_list.append(int(previous_high)) 
     write_line(line[0],min(tmp_list),max(tmp_list),cnt,outf) 
     tmp_l = min(tmp_list) 
     tmp_h = max(tmp_list) 
     tmp_list = [] 
    else: 
     write_line(line[0], previous_low, previous_high, cnt, outf) 
     tmp_l= current_low 
     tmp_h= current_high 

私の解決策が効果的に見えますが、出力はこのようです:気づいたよう

1 27460 30460 ENHANCER0002 1 33725 36725 ENHANCER0003 1 711760 714760 ENHANCER0004 1 724150 728455 ENHANCER0005 1 724150 728455 ENHANCER0006 1 871280 877180 ENHANCER0007 1 871280 877180 ENHANCER0008 1 900540 904475 ENHANCER0009 1 900540 904475 ENHANCER00010 1 910260 913260 ENHANCER00011 1 933355 936355 ENHANCER00012 1 947660 950660 ENHANCER00013 1 1013530 1016530 ENHANCER00014 . . . 1 2477030 2481160 ENHANCER00044 1 2477030 2481845 ENHANCER00045 1 2477030 2481845 ENHANCER00046 がある場合、重複が印刷にあり境界の重なり。最下部と同様に3本の線が重なる場合もあります。

1 27460 30460 ENHANCER0002 1 33725 36725 ENHANCER0003 1 711760 714760 ENHANCER0004 1 724150 728455 ENHANCER0005 1 871280 877180 ENHANCER0006 1 900540 904475 ENHANCER0007 1 910260 913260 ENHANCER0008 . . . 1 2477030 2481845 ENHANCER00046

私のコードの何が問題であり、私はそれがより-より-2ラインが重なる場合であっても操作方法を改善することができます:期待される出力は次のようにすべきですか?

答えて

0

単純な作業では、コードが複雑すぎるようです。 tmp_l、tmp_h、previous_low、およびprevious_highの4つの変数を使用する必要はありません。重複する間隔の現在のリストを維持する必要もありません。あなたがする必要があるのは、オーバーラップする間隔の低い値と高い値を維持することだけです。

ただし、コードでの問題は、繰り返しごとにwrite_lineに電話することです。代わりに、現在のローが前のハイよりも大きい場合にのみ、write_lineに電話してください。これは、以前のオーバーラップ間隔のセットが終了したことを意味します。また、ループの最後にも発生します。

次のコードは動作します:

for line in inf.splitlines(): 
    cnt += 1 
    line = line.split(' ') 
    current_low = int(line[1]) 
    current_high = int(line[2]) 
    if current_low <= previous_high: 
     previous_high = current_high 
    else: 
     if previous_high > 0: 
      write_line(line[0], previous_low, previous_high, cnt, outf) 
     previous_low = current_low 
     previous_high = current_high 

if previous_high > 0: 
    write_line(line[0], previous_low, previous_high, cnt, outf) 

チェックif previous_high > 0を出力しないprevious_lowのデフォルト値とprevious_high必要とされている - ループのために必要とされるの末尾に0、0、余分なWRITE_LINEを重複区間の最終セットを出力する。

このコードは、オーバーラップするインターバルが3つ以上ある場合にも機能します。