我有以下程序:
from collections import Counter
counter=0
lst=list()
fhandle=open('DNAInput.txt','r')
for line in fhandle:
if line.startswith('>'):
continue
else:
lst.append(line)
while counter != len(lst[0]):
lst2=list()
for word in lst:
lst2.append(word[counter])
for letter in lst2:
mc=Counter(lst).most_common(5)
counter=counter +1
print(mc)
它采用以下 inout 文件:
>1
GATCA
>2
AATC
>3
AATA
>4
ACTA
并打印出每个Collin中重复次数最多的字母。 如果没有“from collections import Counter”,我如何制作完全相同的文件
最佳答案
如果我明白你想做什么;在每一列中找到最常见的字符(?)这是你如何做到的:
def most_common(col, exclude_char='N'):
col = list(filter((exclude_char).__ne__, col))
return max(set(col), key=col.count)
sequences = []
with open('DNAinput.txt', 'r') as file:
for line in file:
if line[0] == '>':
continue
else:
sequences.append(line.strip())
m = max([len(v) for v in sequences])
matrix = [list(v) for v in sequences]
for seq in matrix:
seq.extend(list('N' * (m - len(seq))))
transposed_matrix = [[matrix[j][i] for j in range(len(matrix))] for i in range(m)]
for column in transposed_matrix:
print(most_common(column))
这项工作由:
打开您的文件并将其读入列表
,如下所示:
# This is the `sequences` list
['GATCA', 'AATC', 'AATA', 'ACTA']
获取最长DNA序列的长度:
# m = max([len(v) for v in sequences])
5
从这些序列创建一个矩阵(列表的列表):
# matrix = [list(v) for v in sequences]
[['G', 'A', 'T', 'C', 'A'],
['A', 'A', 'T', 'C'],
['A', 'A', 'T', 'A'],
['A', 'C', 'T', 'A']]
填充矩阵,使所有序列的长度相同:
# for seq in matrix:
# seq.extend(list('N' * (m - len(seq))))
[['G', 'A', 'T', 'C', 'A'],
['A', 'A', 'T', 'C', 'N'],
['A', 'A', 'T', 'A', 'N'],
['A', 'C', 'T', 'A', 'N']]
转置矩阵,使列变为顶部 -> 底部
(而不是左侧 -> 右侧
)。这会将来自相同位置的所有字符放在一个列表中。
# [[matrix[j][i] for j in range(len(matrix))] for i in range(m)]
[['G', 'A', 'A', 'A'],
['A', 'A', 'A', 'C'],
['T', 'T', 'T', 'T'],
['C', 'C', 'A', 'A'],
['A', 'N', 'N', 'N']]
最后,遍历转置矩阵中的每个列表并调用 most_common
并将子列表作为输入:
# for column in transposed_matrix:
# print(most_common(column))
A
A
T
C
A
这种方法有一些注意事项;首先,我包含的 most_common
函数将在单个位置中有相同数量的核苷酸的情况下返回第一个值(参见位置 4,这可能是 A
或 C
)。此外,most_common
函数可能比使用集合中的 Counter
花费指数更多的时间。
出于这些原因,我强烈建议使用以下脚本代替,因为 collections
在安装时包含在 python 中。
from collections import Counter
sequences = []
with open('DNAinput.txt', 'r') as file:
for line in file:
if line[0] == '>':
continue
else:
sequences.append(line.strip())
m = max([len(v) for v in sequences])
matrix = [list(v) for v in sequences]
for seq in matrix:
seq.extend(list('N' * (m - len(seq))))
transposed_matrix = [[matrix[j][i] for j in range(len(matrix))] for i in range(m)]
for column in transposed_matrix:
print(Counter(column).most_common(5))
关于python - 没有模块的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53217916/