Überlappende numerische Bereiche werden zu fortlaufenden Bereichen zusammengeführt

Ich versuche, einen Bereich genomischer Koordinaten in kontinuierliche Bereiche zusammenzuführen, mit einer zusätzlichen Option zum Zusammenführen über Lücken hinweg.

Zum Beispiel, wenn ich die Genombereiche hätte[[0, 1000], [5, 1100]] Ich würde das Ergebnis haben wollen[0, 1100]. Wenn die Versatzoption auf gesetzt wurde100und die Eingabe war[[0, 1000], [1090, 1000]] Ich würde wieder einmal das Ergebnis haben wollen[0, 1100].

Ich habe eine Methode implementiert, die die Ausrichtungen der Reihe nach durchläuft und versucht, die vorherige Endposition und die nächste Startposition zusammenzuführen. Dies schlägt jedoch fehl, da die tatsächlichen Ergebnisse unterschiedlich lang sind. Zum Beispiel habe ich die Ergebnisse[[138, 821],[177, 1158], [224, 905], [401, 1169]] in meiner Liste sortiert nach den Startpositionen. Die Antwort darauf sollte sein[138, 1169] aber ich verstehe stattdessen[[138, 1158], [177, 905], [224, 1169]]. Natürlich muss ich mehr berücksichtigen als nur das vorherige Ende und den nächsten Start, aber ich habe keine gute Lösung gefunden (am besten eine, die kein großes Nest von if-Anweisungen ist). Hat jemand irgendwelche Vorschläge?

def overlap_alignments(align, gene, overlap):
    #make sure alignments are sorted first by chromosome then by start pos on chrom
    align = sorted(align, key = lambda x: (x[0], x[1]))
    merged = list()
    for i in xrange(1, len(align)):
        prv, nxt = align[i-1], align[i]
        if prv[0] == nxt[0] and prv[2] + overlap >= nxt[1]:
            start, end = prv[1], nxt[2]
            chrom = prv[0]
            merged.append([chrom, start, end, gene])
    return merged

Antworten auf die Frage(2)

Ihre Antwort auf die Frage