2012-06-15 65 views
1

好吧 - 我有一個兩難的問題。到目前爲止我的腳本將頁面標題轉換爲類別。這是基於關鍵字,當匹配時添加了某個分數,也就是說某些詞語的值爲10,有些詞語只有1。這會累積到每個類別的總分中。Python - 查找數組中排名最高的數字

[{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23,:[3, 'automotive service']}] 

索引是所述類別ID,第一值的得分第二值的類別。

在某些情況下,這跨越了超過10個類別匹配。

我怎麼可以這樣進行過濾,僅前60-75%

即清楚地按摩和美髮沙龍是最大,因爲它們都遠遠高於汽車服務。但是,我們如何使用這種智能進行編程?

我在想stddev可以幫忙嗎?

編輯

我試圖例如過濾掉低分項目

data = [{15: [32, 'massages']}, {45: [1, 'hair-salon']}, {23:[1, 'automotive service']}]] 

按摩是在這種情況下,唯一的高得分項

data = [{15: [4, 'massages']}, {45: [2, 'hair-salon']}, {23:[1, 'automotive service']}]] 

史迪威按摩

data = [{15: [10, 'massages']}, {45: [50, 'hair-salon']}, {23:[5, 'automotive service']}]] 

現在頭髮沙龍(因爲它是遠高於其他)

所以我不需要第一個(N)對象,而且第一個對象的x高於其他數字作爲percen標準偏差的標準或形式。

所以50要高得多,然後10和5

10要高得多然後3或2

然而9,8和6是大致相同的

+0

你的例子看起來像一個詞典列表,而不是字典詞典..無論如何,排序有什麼錯? – Aprillion

+0

Python詞典是無序的,所以如果你想按照分數對這些條目進行排序,你需要將它們存儲在首先像列表一樣排列的東西中。之後,您可以刪除最低的25-40%,這將在正常升序後列表的開頭。 – martineau

+0

噢,是的,我的意思是使它成爲一個詞典列表 – AlexZ

回答

1
yourdata = [{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23:[3, 'automotive service']}] 

# transfer your data into a more usable format 
data = [(score,cat,name) for dat in yourdata for cat,(score,name) in dat.iteritems()] 

# sort on descending score 
data.sort(reverse=True) 

# throw away the low-scoring items 
data = data[:int(len(data)*0.6 + 1)] 

返回

[(32, 15, 'massages'), (12, 45, 'hair-salon')] 

(兩個得分最高的項目)

+1

你可以使用heapq.nlargest()來代替.sort() – jfs

+0

可讀性。如果我們做按摩15,美髮沙龍2和汽車服務2,它仍然會返回美髮沙龍 – AlexZ

+0

請參閱編輯 - 我澄清了位 – AlexZ

5

下面是使用heapq.nlargest()

import heapq 

data = [{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23:[3, 'automotive service']}] 

N = int(len(data) * 0.6 + 1) 
print heapq.nlargest(N, data, key = lambda x: next(x.itervalues())[0]) 

該打印解決方案:

[{15: [32, 'massages']}, {45: [12, 'hair-salon']}] 

編輯:如果你想消除「低分項目」,那麼你需要準確地定義你的意思是什麼「低評分」。

這裏的一些代碼,以「低得分」的一個完全任意的定義:得分低,如果它是在最大值以下多於一個的標準偏差:

import math 

data = [{15: [32, 'massages']}, {45: [1, 'hair-salon']}, {23:[3, 'automotive service']}] 

scores = [score for d in data for cat,(score,name) in d.iteritems()] 
score_mean = sum(scores)/float(len(scores)) 
score_stdev = math.sqrt(sum(abs(s - score_mean)**2 for s in scores)/float(len(scores))) 

print [d for d in data if next(d.itervalues())[0] > (max(scores) - score_stdev)] 

此打印:

[{15: [32, 'massages']}] 
+0

謝謝,看編輯 - 我給了一些細節,我的意思是低得分 – AlexZ

+0

公式爲stdev是錯誤的。它應該是['sqrt(mean(abs(x-x.mean())** 2)'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html) (使用numpy語法) – jfs

+0

使用'.itervalues'只獲取密鑰有點奇怪;爲什麼不只是'next(d.iterkeys())'? – lvc

相關問題