Здесь вы получите несколько резких комментариев, но я постараюсь дать вам несколько указателей :) Судя по вашим данным, кажется, что вы пытаетесь выполнить 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 '%d\t%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