#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.