根据你之前的问题,假定你的数据符合这种格式:
>SeqName1Seq1
>SeqName2
Seq2
...
这里不要求Seq1只占一行(即允许其中有换行符出现)。假如Seq总是只占一行的话,其实就是奇数行是名字,偶数行是序列本体而已,读取不要太简单……
以下是简单的实现。考虑到文件可能很大,使用迭代来逐个读入数据。文件较小的情况可以使用列表表达式直接实现- -。
遍历文件时的流程:
如当前行以'>'开始,将其存为k(序列名称),直到发现下一个序列名称为止的所有行,填入v(序列)。再次发现'>'开始的行时,将(k, v)存入字典,并将v清空。此外的是实现细节。注释之后太啰嗦了,对哪里有疑问请追问。
fileFa = open("SEQ.FASTA", "r")dic, k, v = {}, '', []
for i in fileFa:
if i.startswith('>'):
dic[k] = v
k = i[1:-1]
v = []
else:
v.append(i)
dic[k] = v
dic.pop('')
print "%s sequences in total" % len(dic)
for (k, v) in dic.items():
print("SEQUENCE: %s\nLENGTH:%s" % (k, sum(map(len, v))))
使用你上一问题提供的4个序列,输出如下:
4 sequences in totalSEQUENCE: qwe56_44514
LENGTH:98
SEQUENCE: qwe56_44606
LENGTH:82
SEQUENCE: qwe56_44424
LENGTH:43
SEQUENCE: qwe56_869
LENGTH:39
Python 中的序列是一块可存放多个值的连续内存空间,所有值按一定顺序排列,每个值所在位置都有一个编号,称其为索引,我们可以通过索引访问其对应值。
其实字符串就是序列结构,除此之外常见的序列结构还包括列表、元组等。
序列索引支持非负数和负数, 索引为非负数,从 0 开始 ,如下所示:
以字符串为例,如下所示:
输出结果:
从结果来看,我们使用非负数索引与负数索引得到的结果一致。
切片操作可以访问一定范围内的元素,语法如下所示:
以字符串为例,如下所示:
输出结果:
Python 支持类型相同的序列使用 + 作相加操作,该操作不会去除重复的元素。以字符串为例,如下所示:
输出结果:
Python 中,使用数字 n 乘以一个序列会生成新的序列,内容为原来序列被重复 n 次的结果。以字符串为例,如下所示:
输出结果:
Python 使用 in 关键字检查某元素是否为序列的成员,语法如下:
val in seq
以字符串为例,如下所示:
输出结果:
True
2.6 内置函数
len()—— 计算序列的长度
max()——找出序列中的最大元素
min()——找出序列中的最小元素
list() ——将序列转换为列表
str() ——将序列转换为字符串
sum()——计算元素的和
sorted()——对元素进行排序
enumerate()——将序列组合为一个索引序列,多用在 for 循环中
举例,如下所示:
输出结果:
首先,找规律:
(2 1) (4 3) (6 5) (8 7) ..
发现是每个偶数i与i-1互换位置,或者说:奇数加1,偶数减1。如此一来可以用列表表达式生成(假设长度为n):
[i-1 if i % 2 == 0 else i+1 for i in range(1, n+1)]