所以,我现在正在研究生物信息学课程的问题,并且已经停留在算法上。
我的问题是我似乎无法找到使最后一个函数(SkewMin
)工作的方法,因为它应该只返回Skew
最小化的位置。
是的,我知道索引从0开始,但我会在minimumValues
中添加1个值进行调整,所以请继续:)
# Example:
# index : 1 2 3 4 5 6 7 8 9 10 11 12 13
# Genome => A T T C G G C C C G G C C
# Skew(genome) => 0 0 0 0 -1 0 +1 0 -1 -2 -1 0 -1 -2
# MinSkew(genome) => 9 13
这是实际代码(我删除了Skew
的代码,因为它完成了我上面描述的内容,并且我不允许在线发布工作代码,这也是我不打算提到课程名称):
# MinSkew, uses Skew(genome) to find the positions where Skew is at a minimum.
#EX: Skew("ACGTGCC") gives 0 0 -1 0 0 1 0 -1
# with index 0 1 2 3 4 5 6 7
#and MinSkew("ACGTGC") gives the index of the nucletides scoring -1 in genome
# result: (2,7).
def MinSkew(genome):
dictOfSkew = dict()
skewValues = Skew(genome)
minimumSkew = 0
minimumValues = list()
for i in range(0,len(genome) + 1):
dictOfSkew[i] = skewValues[i]
if minimumSkew > skewValues[i]:
minimumSkew = skewValues[i]
minimumValues.append(i)
return minimumValues
答案 0 :(得分:2)
当前形式的算法不起作用,因为过滤(仅查找最小值)和计算过滤标准(最小值)是交错的。最简单的解决方法是首先找到最小值:
minimumValue = min(skewValues.values())
然后才应用过滤:
minimumKeys = [k for (k,v) in skewValues.items() if v == minimumValue]
(或{2}的iteritems
)
答案 1 :(得分:2)
您的核心错误是,当您找到新的分钟时,您永远不会清除minimumValues
,因此前一分钟的值仍然存在。 BartoszKP的答案很好,但要一次性完成:
if minimumSkew > skewValues[i]:
minimumSkew = skewValues[i]
minimumValues = [i]
elif minimumSkew == skewValues[i]:
minimumValues.append(i)