██. █ █ █ █╗░██. █ ╗░░██. ╗░███. █ █╗░ ██╔══█. █╗██. █ █╗░██║███══██╗ ██║░░██║██. ╔█. █╗██║████████ ██║░░██║███████║███╔══██║ ██████╔╝███. ╚███║██║░░██║ ╚═════╝░╚═╝░░╚══╝╚═╝░░╚═╝.
Всем привет. В этом посте я собираюсь рассказать вам о проблеме Hamming (простой) и моего решения для него. Если вы не лучше, чтобы покинуть этот учебник, потому что это может быть скучно и бесполезно для вас! Но если вы новичок, нести со мной, потому что это была такая прохладная проблема для меня.
Проблема: Рассчитайте расстояние гамма между двумя нитями ДНК.
Ваше тело состоит из клеток, которые содержат ДНК. Эти клетки регулярно изнашиваются и нуждаются в замене, которые они достигают, разделив на дочерние клетки. На самом деле средний человеческий орган переживает около 10 квадриллионных клеточных подразделений в течение жизни!
Когда клетки делятся, их ДНК повторяется тоже. Иногда во время этого процесса ошибки случаются и одинокие кусочки ДНК кодируются с неправильной информацией. Если мы сравним две пряди ДНК и посчитаем различия между ними, мы можем видеть, сколько ошибок произошло. Это известно как «расстояние хэмминга».
Мы читаем ДНК, используя буквы C, A, G и T. Два цепей могут выглядеть так:
GAGCCTACTAACGGGAT CATCGTAATGACGGCCT ^ ^ ^ ^ ^ ^^
У них есть 7 различий, и, следовательно, расстояние Hamming составляет 7.
Расстояние гамминга полезна для многих вещей в науке, а не просто биологии, поэтому это хорошая фраза, чтобы быть знакомой с ❤
Итак, прежде всего, я определил функцию и использовал Если Заявление, чтобы убедиться, если Длина двух утверждений равны или не так:
def distance(strand_a, strand_b): if len(strand_a) == len(strand_b): first_strand = [letter for letter in strand_a] second_strand = [letter for letter in strand_b] else: raise ValueError("The length of Sequences are not equal")
Но я мог бы написать этот кусок кода более простой, вы можете спросить, как? нравится:
def distance(strand_a, strand_b): if len(strand_a) != len(strand_b): raise ValueError("Length of two sequences most be the same")
Как вы можете видеть вместо написания 6-7 строк кода (первое решение) Я написал вторую функцию всего за 3 строки кода!
Итак, давайте посмотрим, что мы можем сделать для следующей части кода … Нам нужно сопрянуть каждый итератор вместе с zip () Функция! нравится:
diff = zip(first_strand, second_strand)
После этого я создал пустой список с двумя целями:
- Положите различия в списке
- Использование Лен () функция, чтобы получить длину различий
count = []
Если для цикла мы смотрим в наших кортежах, чтобы увидеть, если сопряженные итераторы такие же или нет, и добавьте различия в пустой список, который считается = [] И используя Len (счетчик), чтобы получить длину различий от подсчета и возврата Len (счетчик)!
нравится:
for x, y in diff: if x != y: count.append(x) return len(count)
Так что полное решение было бы таким:
def distance(strand_a, strand_b): if len(strand_a) != len(strand_b): raise ValueError("Length of two sequences most be the same") count = [] zip_a_b= zip(strand_a, strand_b) for x, y in zip_a_b: if x != y: count.append(x) return len(count)
Редактировать: Мой друг Джереми Грифски предложил более эффективный способ с меньшим количеством кода:
Это странно создавать и выбросить список только для его длины, Джереми Грифски сказал! Ведь он комментирует свое удивительное решение для улучшения нашего кода, так вот оно: Вместо:
count = [] zip_a_b= zip(strand_a, strand_b) for x, y in zip_a_b: if x != y: count.append(x) return len(count)
Мы используем Генератор-выражения :
count = sum(1 for x, y in zip(strand_a, strand_b) if x != y) return count
Если вы хотите узнать больше о Понимание списка или генератор-выражения Я нашел это Ссылка Полезно понять эти две концепции.
Наконец, если вы думаете, что смогу написать очиститель и более читаемый просто дайте мне знать и оставить комментарий ниже. TNX для чтения моего поста. И тратить вам время со мной.
Продолжай двигаться вперед ツ
Код с 💛.
🅑🅐🅝🅙🅘.
Оригинал: “https://dev.to/banji220/python-hamming-problem-5591”