python - 没有模块的程序

标签 python python-3.x python-2.7

我有以下程序:

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,这可能是 AC)。此外,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/

相关文章:

python - 识别最高行值所属的列,python或R

python - 使用Python在PE文件中搜索字符串

python - Fabric 中的正则表达式和 sed 出现问题

python - 在 wxPython 中调整面板大小时出现图形问题

python - 在 Pandas 数据框中按时间范围对行进行分组

Python Pylab散点图误差条(每个点的误差都是唯一的)

python - 在pygame python3中创建登录系统

python - 使用 py2exe 和 BeautifulSoup。脚本运行正常,但转换为 .exe 后,显示错误

python - 运行Json时出现UnicodeEncodeError

python - 如何沿 x 轴移动图形?