#python #python-3.x
#python #python-3.x
Вопрос:
Я пытаюсь создать код, который подсчитывает, сколько G и C содержится в «цепочке ДНК», и вычисляет процентное соотношение G C в этой цепочке, например
gcContent('CGGTCCAATAGATTCGAA')
44.4444444444
В этой строке 18 букв и 8 G C вместе.
До сих пор я изо всех сил пытаюсь даже посчитать букву G в цепочке в моем коде, это то, что у меня пока есть:
def gcContent(dnaMolecule):
count = 0
for g in dnaMolecule:
dnaMolecule.count('g')
count = 1
return count
и когда я ввожу это в интерактивную оболочку python, результат таков:
In [1]: gcContent('a')
Out[1]: 1.0
Пока что это не учитывает количество G, и это говорит об одном, независимо от того, что, если я введу 1 символ внутри скобок после gcContent
.
Комментарии:
1. Для этого вам не нужен цикл,
dnaMolecule.count('G')
достаточно2. Используйте count или цикл, но не оба, назначьте результат count, и самый важный
'g' != 'G'
.3.Вы вызываете
dnaMolecule.count('g')
, но ничего не делаете с результатом. Кроме того, вы, вероятно, хотите.count('G')
, не.count('g')
.
Ответ №1:
Вы можете использовать count
метод, который есть у каждой строки.
def gcContent(dnaMolecule):
dnaMolecule = dnaMolecule.lower()
count = dnaMolecule.count('g') dnaMolecule.count('c')
return count / len(dnaMolecule)
Для Python 2.x и получение значения от 0 до 100 вместо 0 — 1:
def gcContent(dnaMolecule):
dnaMolecule = dnaMolecule.lower()
count = dnaMolecule.count('g') dnaMolecule.count('c')
return 100.0 * count / len(dnaMolecule)
Комментарии:
1. Хороший и простой ответ (от меня); мой единственный комментарий заключается в том, что в Python 2 вам нужно будет возвращать
count / float(len(dnaMolecule))
из-за проблем с целочисленным делением в Python 2. В остальном, хороший ответ.2. @AlexL. Согласовано. Однако в OP был указан python-3.x.
3. @PavneetSingh Если различие имеет значение, вы могли бы просто удалить
.lower()
, но я не думаю, что ДНК различает их.4. @PavneetSingh Я согласен, регистр не имеет значения в ДНК, но стандарт заключается в том, что все они должны быть написаны заглавными буквами.
5. Кроме того, я бы посоветовал вам создать новую переменную и присвоить
dnaMolecule.lower()
ей; таким образом, вам не придется вызывать.lower()
дважды.
Ответ №2:
Если вы можете использовать Biopython, уже существует предопределенная функция GC
, которая вычисляет содержимое GC для данной последовательности:
from Bio.SeqUtils import GC
print(GC('CGGTCCAATAGATTCGAA'))
Это дает желаемый результат:
44.44444444444444
В зависимости от того, какие дополнительные действия вы хотите выполнить со своей последовательностью, я настоятельно рекомендую использовать предопределенные функции, а не писать свои собственные.
Редактировать:
Поскольку это обсуждается ниже в ответе @ TammoHeeren, GC
также решается проблема с нижним / верхним регистром:
print(GC('CGGGggg'))
дает
100.0
Комментарии:
1. Хороший ответ. Я не знал, что кто-то действительно создал модуль для этого. Интересно!