Например:
String 1: AGGCCT
|| | |
String 2: AGCCAT
Эти две строки идентичны в 4-х позициях, поэтому функция, которую я хочу, вернет 4.
Есть ли умный (т.е. быстрый) метод для этого, кроме очевидного метода итерации через обе строки в одно и то же время?
Спасибо! Uri
Я не думаю, что любой "умный" трюк бьет очевидный подход, если он хорошо выполнен:
sum(c1 == c2 for c1, c2 in itertools.izip(s1, s2))
Или, если использование булевых чисел для арифметических раздражает вас,
sum(1 for c1, c2 in itertools.izip(s1, s2) if c1 == c2)
[ACGT]+
могут быть очень длинными. zip(...)
- это список. Рассмотрите возможность использования itertools.izip
.
Если вы ищете лучшую производительность, я подозреваю, что для этого будет сложно бить numpy:
import numpy as np
a1 = np.frombuffer(s1, dtype=np.byte)
a2 = np.frombuffer(s2, dtype=np.byte)
print (a1==a2).sum()
В моей системе это работает примерно в 10 раз быстрее, чем использование itertools.
Хотя я предпочитаю выражение генератора delnan, это также работает:
>>> from itertools import imap
>>> from operator import eq
>>> sum(imap(eq, 'abcde', 'aacce'))
3