搜索
查看: 9317|回复: 16

【菜鸟Python练习3】[ROSALIND-REVC] 获取反向互补序列

[复制链接]

20

主题

68

帖子

870

积分

版主

Rank: 7Rank: 7Rank: 7

积分
870
QQ
发表于 2016-10-10 12:39:00 | 显示全部楼层 |阅读模式
本帖最后由 bioinfo.dong 于 2016-10-13 03:23 编辑

【3】Complementing a Strand of DNA(获取给定DNA序列的反向互补序列)

* 学写一个简单的Python function的好机会,从此以后就可以拿着这个function到处用了
* 此题可以用于练习string -> list以及list -> string。另外Python强大的list comprehensions功能也可以学习下
* 思路:(1)首先建立一个AT, CG配对的dictionary用于碱基的互补转化
             (2)将reverse转化后的序列分成单独的碱基,存在list中
             (3)用list comprehension可以很容易的用一行code将上述list转化成互补碱基的list
             (4)使用join()可以将list连成string



[Python] 纯文本查看 复制代码
### 3. Complementing a Strand of DNA ###

def reverse_complement(seq):
    ntComplement = {'A':'T', 'C':'G', 'T':'A', 'G':'C'}
    
    revSeqList = list(reversed(seq))
    revComSeqList = [ntComplement[k] for k in revSeqList]

    revComSeq = ''.join(revComSeqList)
    return revComSeq

seq = ''
with open('/Users/DONG/Downloads/rosalind_revc.txt') as f:
    for line in f:
        line = line.rstrip()
        seq += line.upper()
        
print (reverse_complement(seq))

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x



上一篇:【菜鸟Python练习2】[ROSALIND-RNA] 将DNA序列转换为RNA序列
下一篇:【菜鸟Python练习4】[ROSALIND-FIB] Fibonacci的兔子
You really shouldn't spend your time reinventing the wheel
回复

使用道具 举报

20

主题

68

帖子

870

积分

版主

Rank: 7Rank: 7Rank: 7

积分
870
QQ
 楼主| 发表于 2016-10-14 14:27:43 | 显示全部楼层
暮雨寒 发表于 2016-10-14 13:43
请问那个列表生成式是如何做到生成互补碱基的?有点困惑,希望能解释一下,谢谢。 ...

是说这句吧?
[Python] 纯文本查看 复制代码
revComSeqList = [ntComplement[k] for k in revSeqList]


举个例子哈,假设序列是’ACGGTC', 我先把序列reverse,然后再拆成单独的碱基,所以经过
[Python] 纯文本查看 复制代码
 revSeqList = list(reversed(seq))
后,‘ACGGTC’变成了['C', 'T', 'G', 'G', 'C', 'A']。我们不是先定义了一个AT,GC配对的dictionary嘛,列表表达式的意思是,对于['C', 'T', 'G', 'G', 'C', 'A']列表中的每个元素,我都把它变成dictionary中对应的value生成新的列表,这样新列表就变成了['G', 'A', 'C', 'C', 'G', 'T'],然后用join()把这个list再连成字符串就行了

其实
[Python] 纯文本查看 复制代码
 revSeqList = list(reversed(seq))
用list(xxx)不是很有必要,为了展示一下list()的功能就加上去了
You really shouldn't spend your time reinventing the wheel
回复 支持 1 反对 0

使用道具 举报

5

主题

22

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2016-10-11 19:27:02 | 显示全部楼层
python 中也可以用 slice 来获取一个反向list。
比如:
[Python] 纯文本查看 复制代码
>>> a = [1, 2, 3]
>>> a[::-1]
[3, 2, 1]
>>>
回复 支持 反对

使用道具 举报

4

主题

51

帖子

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2016-10-11 22:23:09 | 显示全部楼层
hyacz 发表于 2016-10-11 19:27
python 中也可以用 slice 来获取一个反向list。
比如:
[mw_shl_code=python,true]

没错,考虑到要求是反向+互补,然后做一下碱基互补就更棒了~~~
回复 支持 反对

使用道具 举报

20

主题

68

帖子

870

积分

版主

Rank: 7Rank: 7Rank: 7

积分
870
QQ
 楼主| 发表于 2016-10-12 01:33:45 | 显示全部楼层
hyacz 发表于 2016-10-11 19:27
python 中也可以用 slice 来获取一个反向list。
比如:
[mw_shl_code=python,true]

这样做法也很常用
You really shouldn't spend your time reinventing the wheel
回复 支持 反对

使用道具 举报

4

主题

14

帖子

105

积分

注册会员

Rank: 2

积分
105
发表于 2016-10-14 13:43:21 | 显示全部楼层
请问那个列表生成式是如何做到生成互补碱基的?有点困惑,希望能解释一下,谢谢。
回复 支持 反对

使用道具 举报

4

主题

14

帖子

105

积分

注册会员

Rank: 2

积分
105
发表于 2016-10-14 18:47:02 | 显示全部楼层
bioinfo.dong 发表于 2016-10-14 14:27
是说这句吧?[mw_shl_code=python,true]revComSeqList = [ntComplement[k] for k in revSeqList][/mw_shl ...

嗯,搞懂了,是由于字典取值那部分没学透,现在明白了。您的帖子对我帮助很大,谢谢!
回复 支持 反对

使用道具 举报

20

主题

68

帖子

870

积分

版主

Rank: 7Rank: 7Rank: 7

积分
870
QQ
 楼主| 发表于 2016-10-14 22:09:01 来自手机 | 显示全部楼层
暮雨寒 发表于 2016-10-14 18:47
嗯,搞懂了,是由于字典取值那部分没学透,现在明白了。您的帖子对我帮助很大,谢谢! ...

多谢多谢,有任何问题都可以拿来讨论,一起进步~
回复 支持 反对

使用道具 举报

0

主题

9

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2017-1-7 09:47:44 | 显示全部楼层
版主您好,问一下两个问题,1、为什么将这一行   revComSeqList = [ntComplement[k] for k in revSeqList],写成for k in revseqlist : revcomseqlist =[ntcomplement[k]],结果就出来一个碱基。2、可不可以将这个写成一个小程序 用input输入,然后直接转化
回复 支持 反对

使用道具 举报

0

主题

1

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2017-1-7 16:38:49 | 显示全部楼层
想问一下,为什么我按照这种方法输出来的结果显示invalid syntax呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-7-19 04:28 , Processed in 0.040667 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.