Как получить процентную частоту букв в каждой позиции из списка строк в python?

#python #list #position #grouping

#python #Список #позиция #группировка

Вопрос:

У меня есть список строк, подобных этому:

Список:

 ('aatt')
('aaga')
('aaac')
('gtag')

#the real list have thousands of strings 
  

оптимальным желаемым результатом является файл, разделенный таблицами, подобный этому:

 0       1       2       3
a:75%   a:75%   a:50%   a:25%
g:25%   t:25%   g:25%   c:25%
                t:25%   g:25%
                        t:25%
  

(заголовок не нужен)

Для этого я создал скрипт bash, но сейчас я изучаю python и хотел бы с этим что-то делать.

Это мой код bash:

 #!/bin/bash

for i in $(echo 1 2 3 4) 

do echo $i amp;amp; cat FILE | grep N -v | awk -F "" '{print $'$i'}' | awk -f ./WC 

done
  

где WC находится следующий wordcounter:

 BEGIN {
    FS="[^a-zA-Z] "
}
{
     for (i=1; i<=NF; i  )
          words[toupper($i)]  
}
END {
    for (i in words)
         print i, words[i]
}
  

Комментарии:

1. Мы здесь не для того, чтобы создавать для вас законченные, работающие программы по запросу. Что вы уже пробовали? Что насчет того, что это не сработало? И что еще более важно, как мы, пишущие код для вас, помогаем вам изучать Python?

2. Если вы можете справиться с этой проблемой в bash , наверняка Python будет казаться слишком простым 🙂

3. Это не очень сложная проблема. Я создал сценарий, используя awk и другую команду bash. Мне нужна только некоторая ориентация в python, чтобы сделать это.

4. @Geparada, начните с того, что readline заключите в while какой-нибудь цикл. 🙂

5. Я не публиковал свой код bash, потому что хотел задать вопрос попроще, но я воспользуюсь вашим советом.

Ответ №1:

Получаю здесь несколько резких комментариев, но я попытаюсь дать вам несколько советов 🙂 Судя по вашим данным, похоже, что вы пытаетесь выполнить SNP-вызов для списка имеющихся у вас последовательностей? Учитывая такие данные:

 d = ['aatt','aaga','aaac','gtag']
  

Первое, что вы должны сделать, это предварительно выделить словарь, в котором будет храниться количество букв в каждой позиции. Я предполагаю, что здесь у вас есть только 4 буквы, то есть a, t, c и g, и вы знаете максимальную длину ваших строк. Если вы этого не сделаете, вы можете извлечь его как таковой:

 maxLen = max(map(len,l))
  

Как только у вас это получится, создайте свой словарь:

 freqDict = dict([(i,{'a':0.0,'t':0.0,'c':0.0,'g':0.0}) for i in xrange(maxLen)])
  

А затем сохранить количество букв в каждой позиции:

 for s in l:
  for i,b in enumerate(s):
    freqDict[i][b]  = 1
  

Это должно привести к этому:

 In [26]: freqDict
Out[26]: 
{0: {'a': 3.0, 'c': 0.0, 'g': 1.0, 't': 0.0},
 1: {'a': 3.0, 'c': 0.0, 'g': 0.0, 't': 1.0},
 2: {'a': 2.0, 'c': 0.0, 'g': 1.0, 't': 1.0},
 3: {'a': 1.0, 'c': 1.0, 'g': 1.0, 't': 1.0}}
  

С этого момента вам решать, как вы хотите распечатать свои результаты. Может быть, эффективнее печатать ваши результаты с одной позицией в строке, чтобы вам не приходилось перебирать весь список позиций 4 раза, т.Е.

 for i in freqDict:
  vs = freqDict[i]
  sumvs = sum(vs.values())
  print '%dt%s' % (i,'t'.join(['%s:%.1f' % (b[0],b[1]*100/sumvs) for b in vs.items()]))
  

Генерация:

 0   a:75.0  c:0.0   t:0.0   g:25.0
1   a:75.0  c:0.0   t:25.0  g:0.0
2   a:50.0  c:0.0   t:25.0  g:25.0
3   a:25.0  c:25.0  t:25.0  g:25.0
  

Комментарии:

1. Спасибо за четыре ваших руководства! Никто не заставляет вас отвечать на мой вопрос, однако вы мне очень помогаете 🙂

2. Не беспокойтесь. Хотя все еще может быть хорошей идеей (поскольку многие люди также призывают вас) вставить ваш awk-скрипт и показать, как выглядит ваш входной файл. Таким образом, люди могут предложить вам другие решения, а также способы оптимизации, поскольку я предполагаю, что вы имеете дело с очень большими наборами данных.

3. Я полагаю, что с модулем Numpy можно было бы сделать что-то умное, если бы скорость была проблемой. Numpy добавляет объект array и множество других полезных инструментов для статистического анализа и научных вычислений. Я бы рекомендовал это, как только вы лучше познакомитесь с основами Python.