如何获取字典中与最小值关联的键?
我正在做一个生物信息学课程的作业,现在卡在一个算法上了。
我的问题是,我找不到办法让最后一个函数(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
2 个回答
2
目前这个算法的写法是行不通的,因为在找最小值和计算过滤条件(最小值的大小)这两个步骤之间搞混了。最简单的解决办法是先找到最小值:
minimumValue = min(skewValues.values())
然后再进行过滤:
minimumKeys = [k for (k,v) in skewValues.items() if v == minimumValue]
(如果你用的是Python 2,可以用iteritems
)
2
你的主要错误是,当你找到一个新的最小值时,你从来没有清空 minimumValues
,所以之前的最小值仍然存在。BartoszKP 的回答是可以的,但如果想要在一次循环中完成这个任务:
if minimumSkew > skewValues[i]:
minimumSkew = skewValues[i]
minimumValues = [i]
elif minimumSkew == skewValues[i]:
minimumValues.append(i)