2012-10-16 46 views
2

因爲一些代碼很繁忙,並且有一個基本上需要字典的函數,其中每個值都是一個列表,並返回列表最大的密鑰。編寫一個函數的兩種不同方法(地圖vs循環)

我寫了下面:

def max_list(dic): 
    if dic: 
     l1 = dic.values() 
     l1 = map(len, l1) 
     l2 = dic.keys() 
     return l2[l1.index(max(l1))] 
    else: 
     return None 

別人寫道:

def max_list(dic): 
    result = None 
    maxValue = 0 
    for key in dic.keys(): 
     if len(dic[key]) >= maxValue: 
      result = key 
      maxValue = len(dic[key]) 
    return result 

這將是「正確」的方式做到這一點,如果有一個。我希望這不會被視爲社區維基(即使代碼有效),試圖找出問題的最佳模式。

回答

4

最Python的將是max(dic,key=lambda x:len(dic[x])) ......至少我想...

最大化可讀性和減少的代碼行是Python的...通常

+1

從Python的禪:明確比隱含更好。 簡單勝過複雜。 Flat比嵌套更好。 稀疏比密集好。 如果實施難以解釋,這是一個壞主意。 – phkahler

+0

是的......生活的話:) –

+0

我想知道爲什麼你有一個downvote,我沒有...這似乎不公平... :-( – mgilson

6

另一個有效的選項:

maxkey,maxvalue = max(d.items(),key=lambda x: len(x[1])) 

上面的這兩個,我可能會更喜歡明確的for循環不產生各種中間對象的只是把它們扔掉。


作爲一個側面說明,這種解決方案不空類型的字典工作特別好......(它提出了一個ValueError)。由於我認爲這是一種不尋常的情況(而不是標準),因此將其放入try-except ValueError區塊應該不會受到傷害。

+0

我同意:) ... –

+0

謝謝,這就是爲什麼我愛這樣,總是學到東西:) – ismail

+0

一個小方面說明,代碼實際上只返回鍵,但是你的解決方案是更好的,因爲它返回鍵和鍵的值,以獲得實際的長度,你可以只是len(maxvalue)。 – ismail

1

我想你應該問自己的問題是,你認爲最重要的是:代碼可維護性還是計算速度?

正如其他答案指出的,這個問題有一個非常簡潔的解決方案使用地圖。對於大多數人來說,這個實現可能更容易通過循環來讀取實現。

就計算速度而言,地圖解決方案效率較低,但仍處於相同的Computational Magnitute

因此,我認爲地圖方法不太可能會顯着減少性能。我建議你在你的程序完成後使用一個分析器,這樣你可以確定真正的問題所在,如果你的程序運行速度慢於預期。

相關問題