Porównywanie elementów listy i tworzenie z nich jednego elementu

0

Mam 2 sekwencje:

seq = ["CATGTAGCA", "CATGCCCGA"]

Chciałbym otrzymać z nich jedną sekwencję, która w miejscach niejednoznacznych będzie zawierała odpowiednie znaki.
Wynik powinien być taki:

CATGSYMSSA

Czy ktoś mógłby mi pomóc, w jaki sposób można porównywać elementy listy po kolei?

3
result = [a if a==b else 'S' for (a,b) in zip(*seq)]

Ewentualnie bardziej ogólnie:

result = [function(a,b) for (a,b) in zip(*seq)]

gdzie function to funkcja która dostaje a,b i zwraca wartość to wynikowej listy

0
Shalom napisał(a):
result = [a if a==b else 'S' for (a,b) in zip(*seq)]

Ewentualnie bardziej ogólnie:

result = [function(a,b) for (a,b) in zip(*seq)]

gdzie function to funkcja która dostaje a,b i zwraca wartość to wynikowej listy

A jeśli chce dołożyć więcej możliwości, to w jaki sposób to zrobić?
Próbowałem w taki sposób:

result = [a if a==b else "S" if a in "C"== b in "G" else "N" for (a,b) in zip(*seq)]

Ale nie działa to poprawnie. Chodzi o to, że jeśli w sekwencji a jest "C", a w sekwencji b jest "G", to żeby dawało "S".

0

Ale nie działa to poprawnie. Chodzi o to, że jeśli w sekwencji a jest "C", a w sekwencji b jest "G", to żeby dawało "S".

OK, tylko taka reguła jest, czy są inne?

1

@adrian18 no to dałem ci wersje kodu z funkcją. Użyj tego i napisz dowolne skomplikowaną funkcje :P

0
lion137 napisał(a):

Ale nie działa to poprawnie. Chodzi o to, że jeśli w sekwencji a jest "C", a w sekwencji b jest "G", to żeby dawało "S".

OK, tylko taka reguła jest, czy są inne?

Nie, finalnie ma ona zawierać około 20 różnych możliwości.

1

Jak masz to result = [function(a,b) for (a,b) in zip(*seq)] to piszesz sobie tego function(a, b) (tylko, na bogów, nazwij to jakoś lepiej) i tam umieszczasz logikę. Coś na modłę:

def function(a, b):
    if a == b:
        return a
    if a == "G" and b == "U":
        return "S"
    if a == "G":
        return "G"

Być może da się ładniej, ale nie znając logiki porównywania, nie sposób to stwierdzić…

0

Twój przykładowy wynik ma 10 znaków, a wejściowe napisy po 9. Zakładam, że zrobiłeś błąd i dwukrotnie wpisałeś S. Jeśli tak, to wynikiem powinien być napis "CATGSYMSA". Zatem zdefiniuj sobie słownik z regułami i odpowiednio przeprasuj listy:

rules = {"TC": "S", "AC": "Y", "GC": "M", "CG": "S"}
''.join([rules[''.join(i)] if ''.join(i) in rules else i[0] for i in zip(*seq)])  # CATGSYMSA

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