Ich versuche ein relativ häufiges Problem in der Bioinformatik zu lösen, ohne auf eine Menge if-Anweisungen zurückgreifen zu müssen.Pythonischer Weg, Strings zu "verschmelzen", alle möglichen Längen zu verarbeiten
Das Problem bei der Hand:
Ich bin bei zwei überlappenden Streichern und einer Länge der erwarteten Ausgang, und ich möchte eine fusionierte Kette erzeugen. Hier werden alle Möglichkeiten könnten die Saiten überlappen: (in den folgenden Beispielen eine -
bedeutet, dass es nichts in dieser Zeichenfolge an dieser Position die consensus()
Bit nach den Beispielen erläutert..):
# size=13
xxxOVERLAP---
---OVERLAPyyy
# expected output: xxx + consensus(xOVERLAP, yOVERLAP) + yyy
# size=7
---OVERLAPxxx
yyyOVERLAP---
# expected output: consensus(xOVERLAP, yOVERLAP)
# size=7
OVERLAP
OVERLAP
# expected output: consensus(xOVERLAP, yOVERLAP)
# size=10
xxxOVERLAP
---OVERLAP
# expected output: xxx + consensus(xOVERLAP, yOVERLAP)
# size=10
OVERLAP---
OVERLAPyyy
# expected output: consensus(xOVERLAP, yOVERLAP) + yyy
# size > len(x) + len(y)
# no overlap, produce error:
xxx---
---yyy
# expected output: error
Die resultierende fusionierte Zeichenfolge muss beginnen mit dem Anfang von x
und Ende mit dem Ende y
. Die Region, die sich überschneidet, muss an eine andere Funktion übergeben werden, consensus()
, die sich mit dem Zusammenführen der überlappten Region befasst. hier alle Möglichkeiten, die Saiten überlappen könnten: (in den folgenden Beispielen eine -
zeigt, dass es nichts an dieser Position in dieser Zeichenfolge ist)
def merge(x, y, size):
# do the mergeing
return part of x that doesn't overlap + consensus(overlap) + part of y that doesn't overlap.
ich ein Durcheinander von Code können, wenn Aussagen jeden Fall zu erkennen und sich individuell damit befassen, aber ich habe mich bemüht, eine elegantere Lösung zu finden. Ein Ansatz, den ich in Betracht gezogen habe, ist das Auffüllen der Strings (das Ende von x und der Anfang von y), so dass alle Fälle wie das zweite Beispiel aussehen, aber das scheint zu ineffizient, um schmackhaft zu sein, da ich dann neue Strings machen würde und ich wende diese Funktion an Millionen von Strings an.
Ich habe nicht die Beschreibung folgen. In Ihren Beispielen geben Sie drei Eingaben an, aber nicht die Ausgabe für jedes Beispiel. – user590028
edited, um die erwartete Ausgabe zu zeigen – elsherbini
Sie können von hier https://en.wikipedia.org/wiki/Longest_common_substring_problem – BlackBear