2013-01-04 32 views
1

我在這個任務上遇到了幾個小時的麻煩,而且我只是停留在做什麼。遞歸地找到正確的讀取順序

首先,我需要一個函數,它接受一個字典參數,然後返回與最大值關聯的鍵。這是我已經試過:

def findKeyForLargestValue(d): 
    maxKey = '' 
    maxValue = 0 

    for name in d: 
     for subName in d[name]: 
      d = d[name][subName] 

    if d > maxValue: 
     maxKey = subName 

    return maxKey 

然後我需要做一個函數,需要一個字符串「名稱」和一本字典「重疊」作爲以讀取名稱必須返回一個列表參數中,他們代表的基因組序列:

`DEF findOrder(姓名,重疊):

readOrder = []`

我需要使用函數findKeyForLargestValue(d)其它功能的內部。我需要使用base case,它應該返回[name]和遞歸大小寫,它應該返回[name] + findOrder(nextName),其中nextName是與當前讀取(名稱)右端重疊最大的讀取名稱。

任何幫助表示讚賞,因爲我真的迷路了。甚至不確定findKeyForLargestValue的代碼是否正確

+0

「基因組序列」? – asheeshr

+0

對於你的第一個問題:'import operator; d = {'a':1,'c':3,'b':2}; sort(d.iteritems(),key = operator.itemgetter(1))',返回一個元組列表,按鍵排序:'[('a',1),('b',2),('c ',3)]'。或者更好,只是'max'而不是排序(參見mgilson的回答)。 – miku

回答

0

首先,您的縮進不正確。

def findKeyForLargestValue(d): 
    for name in d: 
     for subName in d[name]: 
      d = d[name][subName] 

      if d > maxValue: #Look at the indentation here 
       maxKey = subName #And here 

    return maxKey 
2

「簡單」的答案是使用內置的max功能:

from operator import itemgetter 
def findKeyForLargestValue(d): 
    key,value = max(d.items(),key=itemgetter(1)) 
    return key 

正如在評論中指出,如果內存是真的一個問題,你正在使用python2.x,那麼你可以使用d.iteritems()而不是d.items()。我通常使用d.items(),因爲它可以在不修改(在這種情況下)的情況下在python2.x和python3.x上工作,而與d.items()相關的附加內存與d.iteritems()相比幾乎總是與我所做的任何工作無關。


如果你感到困惑itemgetter,請參閱以下內容:

def func(seq): 
    return seq[1] 

#`func(x)` will return the same thing that `itemgetter(1)(x)` returns 
# for any indexible object `x` 
+0

我的想法。或者只是'return max(d.items(),key = itemgetter(1))[0]'。另外,使用'iteritems()'而不是'items()'可能會有好處。 – arshajii

+0

@ A.R.S。 - 我從來沒有真正看到「iteritems」的魅力 - 特別是在你不知道OP使用python2.x的情況下。真的,如果你已經可以將字典存儲在內存中,那麼在99%的情況下存儲它的鍵/值對的附加列表將不重要... – mgilson

+0

+1 - 我將建議'max(d,key = lambda x:max(d [x] [y] for y in d [x]))'如果有多個嵌套的鍵具有不同的名稱,但是我可能錯誤地讀了它(這並不是很漂亮:))。 – RocketDonkey