2013-05-15 35 views
3

我有以下三個整數值:存儲多個整數值在一個列表,並返回最佳值對

id  # identifies the pair 
entropy # gives entropy information 
len  # basicly the length of a string 

現在我想要存儲的許多設置值,選擇排名前10位總具有最高熵在n

from collections import defaultdict 

d = defaultdict(list) 

for id, entropy, len in generateValues: 
    d[id].append(entropy) 
    d[id].append(len) 

# now get the top 10 values 

的長度值可以這樣很容易做到?

+0

爲什麼使用defaultdict?難道你不能只用'd [id] = [entropy,len]' – jamylak

+0

@jamylak設置這個,google告訴我的第一件事是defaultdict ...我會認爲你的解決方案更具可讀性:) – reox

回答

5

你可以像這樣構造字典後得到前10個值。儘管如果在構建字典時發現它們,如果可能的話,會有更高效的解決方案。

import heapq 
heapq.nlargest(10, (k for k in d if d[k][1] > n), key=lambda k: d[k][0]) 
+0

@gnibbler剛剛看到,更新 – jamylak

+0

這只是美麗的:o(需要等待4分鐘才能接受...) – reox

+0

酷不知道heapq,它只是我或者是類似於mptts的算法 – user2298943

1

爲了解決問題,sorted支持key論點:

filtered = ((k,v) for k,v in d.iteritems() if v[1] > n) # or filter(d.iteritems(), lambda t: t[1][1] > n) 
topTen = sorted(filtered, key=lambda t: t[0], reversed=true)[:10] 

這是,IMHO,超過可讀的(和相當於效率)使用heapq的解決方案。

+1

這是O(n log n),heapq是O(n)。可能沒有關係,直到有一個_lot_的值雖然 –

+0

@gnibbler是不heapifying數據O(n日誌n)?或者我是誤解了,或者誤認了「最大」的作用? – RoadieRich

+0

@RoadieRich數據沒有被heapified(但heapifying佔用O(N)線性時間),它只是'heapq'模塊內的一個函數,可能會誤導 – jamylak

相關問題