如何获取字典中与最小值关联的键?

0 投票
2 回答
555 浏览
提问于 2025-04-28 04:07

我正在做一个生物信息学课程的作业,现在卡在一个算法上了。

我的问题是,我找不到办法让最后一个函数(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)

撰写回答