我正在寻找一种漂亮的pythonic方法来找到DNA序列中的开放阅读框架.我发现许多在线实现使用索引,标志和其他这样的丑陋.
我很确定可以创建正则表达式实现,但我对正则表达式不好.一般的想法是我想通过'ATG','TAG','TGA'和'TAA'分割出一串DNA序列.但是我不想在重叠区域上分裂,例如序列'ATGA'应该分成'ATG','A'.基本上在三个框架中的每个框架中从左到右.
为清晰起见编辑:如评论中所述,尽管存在(在非零帧中),但ATGATTTTGA应该将一个序列拆分为ATG,TTTTGATGA
edit2:这就是我在没有正则表达式的情况下使用list comprehension splitting链接实现的方法.我讨厌使用旗帜.
def find_orf(seq):
length = 0
stop = ['TAA','TGA','TAG']
for frame in range(3):
orfFlag, thisLen = None, 0
splitSeq = [seq[start+frame:start+frame+3] for start in range(0,len(seq),3)]
for codon in splitSeq:
if codon == 'ATG':
orfFlag = True
thisLen += 1
elif orfFlag and codon in stop:
orfFlag = None
if thisLen > length:
length = thisLen
else:
thisLen += 1
return length
Run Code Online (Sandbox Code Playgroud) 我从作为S4对象类型的包(apcluster)输出.其中一个成员是确定找到的每个群集成员的列表.我想按长度(最大的簇)排序该列表.
我的代码现在看起来像
ap.result <- apcluster(args)
clusters <- ap.result@cluster #list of lists
Run Code Online (Sandbox Code Playgroud)
那么我可以访问的各个成员clusters通过clusters[[i]],但该命令是半随机的.如果我unlist(clusters)然后我得到一个向量而不知道它来自哪个子列表.
如何ap.result@cluster按最长成员列表排序到最短的成员列表?
我正在尝试将一系列基因组坐标合并为连续范围,并提供一个用于跨间隙合并的附加选项。
例如,如果我有基因组范围,[[0, 1000], [5, 1100]]我希望结果是[0, 1100]. 如果偏移选项设置为100,并且输入为 ,[[0, 1000], [1090, 1000]]我将再次希望结果为[0, 1100]。
我已经实现了一种执行此操作的方法,该方法按顺序逐步完成对齐,并尝试合并上一个结束位置和下一个起始位置,但它失败了,因为实际结果的长度不同。例如,我[[138, 821],[177, 1158], [224, 905], [401, 1169]]的列表中的结果按开始位置排序。答案应该是[138, 1169],但我却得到了[[138, 1158], [177, 905], [224, 1169]]。显然,我需要考虑的不仅仅是前一个结束和下一个开始,但我还没有找到一个好的解决方案(最好不是一大堆 if 语句)。有人有什么建议吗?
def overlap_alignments(align, gene, overlap):
#make sure alignments are sorted first by chromosome then by start pos on chrom
align = sorted(align, key = lambda x: (x[0], x[1]))
merged = list()
for i in xrange(1, len(align)):
prv, nxt …Run Code Online (Sandbox Code Playgroud) 我已经实现了以下类,根据输入频率'p'生成'p'或'q'.但是,如果频率小于用于存储选项的列表的大小,则此实现会中断.有没有办法可以实现这个来为p的任何值工作?
from random import random
class AlleleGenerator(object):
"""
allele generator - will break if p < 0.001
"""
def __init__(self, p):
"""construct class and creates list to select from"""
self.values = list()
for i in xrange(int(1000*p)):
self.values.append('p')
while len(self.values) <= 1000:
self.values.append('q')
def next(self):
"""Returns p or q based on allele frequency"""
rnd = int(random() * 1000)
return self.values[rnd]
def __call__(self):
return self.next()
Run Code Online (Sandbox Code Playgroud) 根据输入数据的大小/形状,每页上可以有偶数或奇数的图.
我设置par(mfrow)为值,使得它是可以容纳所有图的最小网格,但是现在我想确保它在下一个循环迭代中移动到下一页,在图的总数最终奇数或不适合网格.
如何强制新页面?谷歌向我展示了grid.newpage(),但我得到了错误
> grid.newpage()
Error: could not find function "grid.newpage"
Run Code Online (Sandbox Code Playgroud)
当我尝试使用它.此外,除非我弄错了,基础绘图不会grid反正使用,所以这对我没有帮助.
我有下面的测试用例,我在其中找到两个字符串中的元素,并按照第一个字符串的顺序返回它们.为什么是第二种情况,set(string2)列表理解中的内容在一个数量级上减慢了?
import timeit
timeit.timeit(
"""
import random, string
string1 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
string2 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
v=set(string2)
[x for x in string1 if x in v]
""",
number=10,
)
# 2.005337953567505
timeit.timeit(
"""
import random, string
string1 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
string2 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
[x for x in string1 if x in set(string2)]
""",
number=10,
)
# 22.1062970161438
Run Code Online (Sandbox Code Playgroud) 我正在尝试对 networkx Graph 对象进行子类化。我的__init__有一个变量传递给它。但是,这意味着当我尝试使用以下调用的方法时connected_component_iter,
def connected_component_iter(self):
"""
Yields connected components.
"""
assert self.is_built is True
for subgraph in nx.connected_component_subgraphs(self):
yield subgraph
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src/unitigGraph.py", line 163, in connected_component_iter
def connected_component_iter(self):
File "/Library/Python/2.7/site-packages/networkx/algorithms/components/connected.py", line 94, in connected_component_subgraphs
yield G.subgraph(c).copy()
File "/Library/Python/2.7/site-packages/networkx/classes/graph.py", line 1486, in subgraph
H = self.__class__()
TypeError: __init__() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
我真的不想删除我的初始化类变量。有什么方法我仍然可以使用 的connected_component_iter方法Graph吗?
假设我有这些数字集
a = {1, 2, 3}
b = {2, 3, 4}
c = {1, 5}
Run Code Online (Sandbox Code Playgroud)
我想找到集合的所有不同的数字分组.结果将是
{1}, {2, 3}, {4}, {5}
Run Code Online (Sandbox Code Playgroud)
我的天真方法,不起作用,是这样的:
data = [{1, 2, 3}, {2, 3, 4}, {1, 5}]
for i in range(1, 5):
s = set.intersection(*[x for x in data if i in x])
print(s)
Run Code Online (Sandbox Code Playgroud)
哪个回报
set([1])
set([2, 3])
set([2, 3])
set([2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
哪个可以很容易地重复删除,但不会给出预期的结果.
如何只获取集合子集中存在的数字分组?
如果你有一个很长的列表列表[['A',1,2],['B',3,4]],你希望将它组合成['A, 1, 2', 'B, 3, 4']一个简单的列表理解方式吗?
我是这样做的:
this_list = [['A',1,2],['B',3,4]]
final = list()
for x in this_list:
final.append(', '.join([str(x) for x in x]))
Run Code Online (Sandbox Code Playgroud)
但这是否可以作为一个班轮来完成?
谢谢你的回答.我喜欢基于map()的一个.我有一个后续问题 - 如果子列表不是格式['A',0.111,0.123456],那么可以在列表解析中包含一个字符串格式化部分来截断,例如退出'A, 0.1, 0.12'
再一次用我丑陋的代码就像是:
this_list = [['A',0.111,0.12345],['B',0.1,0.2]]
final = list()
for x in this_list:
x = '{}, {:.1f}, {:.2f}'.format(x[0], x[1], x[2])
final.append(x)
Run Code Online (Sandbox Code Playgroud)
我解决了自己的问题:
values = ['{}, {:.2f}, {:.3f}'.format(c,i,f) for c,i,f in values]
Run Code Online (Sandbox Code Playgroud) 使用下面的示例,在我的机器上,设置range(150)会导致错误,而range(100)不是:
from peewee import *
database = SqliteDatabase(None)
class Base(Model):
class Meta:
database = database
colnames = ["A", "B", "C", "D", "E", "F", "G", "H"]
cols = {x: TextField() for x in colnames}
table = type('mytable', (Base,), cols)
database.init('test.db')
database.create_tables([table])
data = []
for x in range(150):
data.append({x: 1 for x in colnames})
with database.atomic() as txn:
table.insert_many(data).upsert().execute()
Run Code Online (Sandbox Code Playgroud)
导致:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/cluster/home/ifiddes/python2.7/lib/python2.7/site-packages/peewee.py", line 3213, in execute …Run Code Online (Sandbox Code Playgroud)