Wyszukiwanie znaku od środka napisu w obie strony

Odpowiedz Nowy wątek
2020-06-29 22:39

Rejestracja: 1 miesiąc temu

Ostatnio: 1 tydzień temu

0

Witam,
mam sekwencję :

---------------C----C---GT----GTR-GGK---AC-TGM-GGA-GGW--CATTGTCGAA-CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACGCGGGGTGGCCCCGGCTGCCTCGCGCGGAGGTGCTGCGGCTGAGTGCGCAAACTAGCTGCGCGCACGCTGTCCGTGCCACCTCCACTAACAGAACCCCGGCGCGGACTGCGCCAAGGAATAAAAAACGAATGAGAGCGAGCGCGCCCCCCTCGCCCCGGAGACGGTGCGCGATGGTGTGTGCCTCGCTGTCCATTGATAAACTAAACGACTCTCGGCAACGGATATCTCGGCTCTCGCATCGATGAARAACGTAGCGAAATGCGATACTTGGTGTGAATTGCAR-AATCCCGTGAATCATCGAGTCTTTGAACGCAAGTTGCGCCCGAAGCCTTCTGGCCGAGGGCACGTCTGCCTGGGTGTCACGCAACGTCGCCGCCAACCCCACCCCTAGGGGCGGGAAGTTGGGGGCGGACTCTGGCCTCCCGTGCGCCTCGGCGCGCGGATGGCCTAAATTTCAGCTCCTGGCGAGGATCGCCACGACAAGCGGTGGTTTTTTGAACTAAGGACCTCGGGTGTTGTCGTGCGGCCTCCCGGAGGGAACGGACCCTGTGCGCTCGCGCACCATCCTATCGAGACCCCAGGTCAGTCGG--GAACACC-CGCTGAATTTAAGCATATCAATAAGCGGAGG'

Chciałbym zrobić wyszukiwanie znaku "-" od środka tej sekwencji do początku i na koniec, w obie strony. A następnie po znalezieniu pierwszego znaku od środka w lewą i prawdą stronę, usunąć to co się znajduje przed nim, żeby ostatecznie otrzymać coś w tym stylu:

CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACGCGGGGTGGCCCCGGCTGCCTCGCGCGGAGGTGCTGCGGCTGAGTGCGCAAACTAGCTGCGCGCACGCTGTCCGTGCCACCTCCACTAACAGAACCCCGGCGCGGACTGCGCCAAGGAATAAAAAACGAATGAGAGCGAGCGCGCCCCCCTCGCCCCGGAGACGGTGCGCGATGGTGTGTGCCTCGCTGTCCATTGATAAACTAAACGACTCTCGGCAACGGATATCTCGGCTCTCGCATCGATGAARAACGTAGCGAAATGCGATACTTGGTGTGAATTGCAR-AATCCCGTGAATCATCGAGTCTTTGAACGCAAGTTGCGCCCGAAGCCTTCTGGCCGAGGGCACGTCTGCCTGGGTGTCACGCAACGTCGCCGCCAACCCCACCCCTAGGGGCGGGAAGTTGGGGGCGGACTCTGGCCTCCCGTGCGCCTCGGCGCGCGGATGGCCTAAATTTCAGCTCCTGGCGAGGATCGCCACGACAAGCGGTGGTTTTTTGAACTAAGGACCTCGGGTGTTGTCGTGCGGCCTCCCGGAGGGAACGGACCCTGTGCGCTCGCGCACCATCCTATCGAGACCCCAGGTCAGTCGG

Czy istnieje jakaś funkcja, którą mógłbym wykorzystać?
Dziękuję za każdą odpowiedź

"od środka", Co jest środkiem dla _A_C? - lion137 2020-06-29 23:40
Zmierzyć długość tego string - len. Przekroić na pół. "Zadziałać" na nim i skleić. Proszę o krótszy przykład przed i po (co chcesz uzyskać). - Radosław Głębicki 2020-06-30 06:00

Pozostało 580 znaków

2020-06-29 22:44

Rejestracja: 3 lata temu

Ostatnio: 1 sekunda temu

0

Keyword: wyrazenia regularne

*Sorry, przeczytalem jeszcze raz i chodzi Ci o cos delikatnie innego. To nie mozesz zrobic dokladnie to co opisales? Przeiterowac sie w lewo i prawo zeby znalezc offsety?

https://stackoverflow.com/que[...]bstring-of-a-string-in-python

edytowany 2x, ostatnio: stivens, 2020-06-29 22:48

Pozostało 580 znaków

2020-06-30 12:12

Rejestracja: 11 miesięcy temu

Ostatnio: 18 minut temu

0

Bez kombinowania.

def spliter(string):
    splited = string.split("-")
    len_splited = ([len(x) for x in splited])
    return (splited[len_splited.index(max(len_splited))]+splited[len_splited.index(max(len_splited))+1])

e = "---------------C----C---GT----GTR-GGK---AC-TGM-GGA-GGW--CATTGTCGAA-CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACGCGGGGTGGCCCCGGCTGCCTCGCGCGGAGGTGCTGCGGCTGAGTGCGCAAACTAGCTGCGCGCACGCTGTCCGTGCCACCTCCACTAACAGAACCCCGGCGCGGACTGCGCCAAGGAATAAAAAACGAATGAGAGCGAGCGCGCCCCCCTCGCCCCGGAGACGGTGCGCGATGGTGTGTGCCTCGCTGTCCATTGATAAACTAAACGACTCTCGGCAACGGATATCTCGGCTCTCGCATCGATGAARAACGTAGCGAAATGCGATACTTGGTGTGAATTGCAR-AATCCCGTGAATCATCGAGTCTTTGAACGCAAGTTGCGCCCGAAGCCTTCTGGCCGAGGGCACGTCTGCCTGGGTGTCACGCAACGTCGCCGCCAACCCCACCCCTAGGGGCGGGAAGTTGGGGGCGGACTCTGGCCTCCCGTGCGCCTCGGCGCGCGGATGGCCTAAATTTCAGCTCCTGGCGAGGATCGCCACGACAAGCGGTGGTTTTTTGAACTAAGGACCTCGGGTGTTGTCGTGCGGCCTCCCGGAGGGAACGGACCCTGTGCGCTCGCGCACCATCCTATCGAGACCCCAGGTCAGTCGG--GAACACC-CGCTGAATTTAAGCATATCAATAAGCGGAGG"
print(spliter(e))
edytowany 1x, ostatnio: ledi12, 2020-06-30 12:59
Pokaż pozostałe 10 komentarzy
tutaj ani nie ma byc mergowania ani to nie maja byc najwieksze matche - stivens 2020-06-30 15:11
bierzesz doslowny srodek stringa i robisz ekspansje w prawo i w lewo dopoki nie napotkasz - - stivens 2020-06-30 15:11
Hmm zinterpretowalem sam opis jakoby operacja miala sie zaczac od "-" najblizej srodka. - ledi12 2020-06-30 15:14
a no to wtedy z taka interpretacja (nie jest ona bezpodstawna) mergowanie jak najbardziej na miejscu tylko, ze i tak wcale nie musza to byc dwa najwieksze matche - stivens 2020-06-30 15:15
Jasne ze nie, to jedna z wielu mozliwosci - ledi12 2020-06-30 15:16

Pozostało 580 znaków

2020-06-30 15:16

Rejestracja: 1 rok temu

Ostatnio: 1 tydzień temu

0

O(n) time, O(1) extra space. 39 linii z testami.

> grep -c '\S' catg.py
39
> 

Co jest środkiem dla -A-C?

A jest bliżej środka.

- A - C
0 1 2 3
   ^

Pozostało 580 znaków

2020-06-30 15:24

Rejestracja: 1 rok temu

Ostatnio: 5 godzin temu

1

find wyszukuje od lewej, rfind od prawej. Wychodzi coś w rodzaju

>>> s = '---------------C----C---GT----GTR-GGK---AC-TGM-GGA-GGW--CATTGTCGAA-CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACGCGGGGTGGCCCCGGCTGCCTCGCGCGGAGGTGCTGCGGCTGAGTGCGCAAACTAGCTGCGCGCACGCTGTCCGTGCCACCTCCACTAACAGAACCCCGGCGCGGACTGCGCCAAGGAATAAAAAACGAATGAGAGCGAGCGCGCCCCCCTCGCCCCGGAGACGGTGCGCGATGGTGTGTGCCTCGCTGTCCATTGATAAACTAAACGACTCTCGGCAACGGATATCTCGGCTCTCGCATCGATGAARAACGTAGCGAAATGCGATACTTGGTGTGAATTGCAR-AATCCCGTGAATCATCGAGTCTTTGAACGCAAGTTGCGCCCGAAGCCTTCTGGCCGAGGGCACGTCTGCCTGGGTGTCACGCAACGTCGCCGCCAACCCCACCCCTAGGGGCGGGAAGTTGGGGGCGGACTCTGGCCTCCCGTGCGCCTCGGCGCGCGGATGGCCTAAATTTCAGCTCCTGGCGAGGATCGCCACGACAAGCGGTGGTTTTTTGAACTAAGGACCTCGGGTGTTGTCGTGCGGCCTCCCGGAGGGAACGGACCCTGTGCGCTCGCGCACCATCCTATCGAGACCCCAGGTCAGTCGG--GAACACC-CGCTGAATTTAAGCATATCAATAAGCGGAGG'
>>> left_index = s[:len(s)/2].rfind('-')
>>> right_index = s[len(s)/2:].find('-')
>>> s[left_index+1:len(s)/2+right_index]
'CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACGCGGGGTGGCCCCGGCTGCCTCGCGCGGAGGTGCTGCGGCTGAGTGCGCAAACTAGCTGCGCGCACGCTGTCCGTGCCACCTCCACTAACAGAACCCCGGCGCGGACTGCGCCAAGGAATAAAAAACGAATGAGAGCGAGCGCGCCCCCCTCGCCCCGGAGACGGTGCGCGATGGTGTGTGCCTCGCTGTCCATTGATAAACTAAACGACTCTCGGCAACGGATATCTCGGCTCTCGCATCGATGAARAACGTAGCGAAATGCGATACTTGGTGTGAATTGCAR'
edytowany 1x, ostatnio: Spearhead, 2020-06-30 15:26
Dostaję taki błąd: left_index = s[:len(s)/2].rfind('-') TypeError: slice indices must be integers or None or have an index method - adrian18 2020-06-30 17:17
A bo odpaliłem w Pythonie 2.7, a ty używasz 3. Użyj // by dzielić całkowitoliczbowo (left_index = s[:len(s)//2].rfind('-')) - Spearhead 2020-06-30 17:24
A czy można teraz w jakiś sposób zastosować find oraz rfind w liście? - adrian18 2020-06-30 17:32
Możesz użyć index by wyznaczyć pozycję elementu. Sprawdź tu - Spearhead 2020-06-30 17:37

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0