Определение функции, которая считает 2 буквы и делит их на общую длину слова

#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. Хороший ответ. Я не знал, что кто-то действительно создал модуль для этого. Интересно!