Как напечатать непревзойденную букву по шаблону

У меня есть два набора данных о последовательности белка. Как видите, эти 2 последовательности выглядят одинаково, но на самом деле между ними находится 1 разная аминокислота (буква).

Например:

Файл 1:

TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISEVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K

Файл 2:

TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISVVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K

Желаемый результат:

Файл 1:

E

Файл 2:

V

Я знаю, что мы можем напечатать разные шаблоны из двух наборов данных, используя команду grep, comm, diff; поиск основан на строке. Но в этой ситуации, как мне напечатать букву, отличающуюся между этими двумя шаблонами? Спасибо.


person user9147488    schedule 28.12.2017    source источник


Ответы (3)


Я не думаю, что вам нужен модуль re здесь. Просто цикл может исправить ваш код.

file1='TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISEVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K'
file2='TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSISVVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K'
for i in range(len(file1)):
    if(file1[i]!=file2[i]):
        print(file1[i]),(file2[i])

Ваш вывод: E V

Здесь мы сравниваем файлы по буквам.

person Karthick Balaji    schedule 28.12.2017
comment
вроде самый нормальный подход - person InfiniteFlash; 28.12.2017
comment
Да, и я не думаю, что ему нужен подход к сопоставлению с образцом @InfiniteFlashChess - person Karthick Balaji; 28.12.2017

Цикл for:

test_two_strings <- function(string1 = file1, string2 = file2){
                          for(i in 1:nchar(file1)){
                            if (substr(file1, i, i) != substr(file2,i, i)){
                              cat(paste("File 1:", substr(file1, i, i) ,"File 2:", substr(file2, i, i),sep = "\n"))
                              break()
                                       }
                                  }
                             }

microbenchmark(test_two_strings(), times = 1000)

VUnit: microseconds
               expr     min      lq     mean  median      uq      max neval
 test_two_strings() 133.927 144.199 169.5508 148.544 160.791 2132.148  1000
person InfiniteFlash    schedule 28.12.2017
comment
Обратите внимание, что я печатаю на консоль, как хотел OP. - person InfiniteFlash; 28.12.2017
comment
вы разрываете петлю, а это значит, что вы находите первое несоответствие, верно? Мое решение проходит через всю строку символов - person Sathish; 28.12.2017
comment
Да, я ломаю его, как только обнаруживается первое несоответствие - person InfiniteFlash; 28.12.2017

Вы также можете попробовать это, я сравниваю каждую две строки, если условие не выполняется, я проверяю между строками.

str1 ="TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSESsVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K"
str2 ="TV*TV*TV*TISTI*VWGKIGIRIE*PWIVSVSsVESVACNSKNSNNNSE*K**FSEHFDLNYEN*K"

for i in range(len(str1)/2):
    if(str1[i:i+2] !=  str2[i:i+2]):
         if  (str1[i:i+1] !=  str2[i:i+1]):
            str1[i:i+1]+"\n"+str1[i+1:i+2]
         else:
            print str1[i+1:i+2]+"\n"+str2[i+1:i+2]
person mkHun    schedule 28.12.2017