如何获得与dict中的最小值相关联的键?

时间:2014-10-17 16:58:56

标签: python dictionary bioinformatics

所以,我现在正在研究生物信息学课程的问题,并且已经停留在算法上。

我的问题是我似乎无法找到使最后一个函数(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 个答案:

答案 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)