У меня есть коллекция из нескольких тысяч строк (последовательностей ДНК). Я хочу сократить это число до пары сотен (точное число не критично), исключив очень похожие последовательности.
Я могу сделать это с помощью сопоставления с помощью модуля «Левенштейн». Это работает, но довольно медленно, и я почти уверен, что должен быть гораздо более быстрый способ. Код здесь — тот же подход, но примененный к словам, чтобы сделать его более проверяемым; у меня с такой отсечкой это занимает около 10 секунд и собирает ~1000 слов.
import Levenshtein as lev
import random
f = open("/usr/share/dict/words", 'r')
txt = f.read().splitlines()
f.close()
cutoff = .5
collected = []
while len(txt) > 0:
a = random.choice(txt)
collected.append(a)
txt = filter( lambda b: lev.ratio(a,b) < cutoff, txt)
Я пробовал несколько разных вариантов и некоторые другие соответствующие модули (медузы), но они не стали значительно быстрее.