2012-12-26 61 views
0

我有一個多維列表,其中我想使用排序上的兩個數字元素,示例的組合加權,結果:sorted(results, key=operator.itemgetter(2,3))蟒multimdimensional排序,組合值

[..,1,34] 
... 
... 
[..,10,2] 
[..,11,1] 
[..,13,3] 
[..,13,3] 
[..,13,3] 
[..,16,1] 
[..,29,1] 

與itemgetter的問題是,是首先按元素2排序,然後按元素3排序,其中 我希望頂部/底部的13,3(取決於asc/desc排序)。

這是可能的,如果是的話如何。

非常感謝

編輯1.

對不起,我是鈍的,我處理DOM數據,從搜索頁面結果,它是一個通用搜索引擎搜索,可以這麼說。

我在做的是找到a和div標籤,然後我創建了一個特定的類或id發生多少個項目div/a標籤,這是元素2,然後我重新掃描找到的標籤列表再看看標籤中其他類/ id是否與正在處理的當前標籤的總數匹配,因此在這種情況下,項目13,3對於該類型標籤具有13個類/ id的匹配,並且3表示其他3個其他帶有class/id的標籤發生的次數相同,因此我希望按這種排序,不,它不是字典,它絕對是一個列表。

謝謝。

+0

你**不**有多維列表/字典。你有一個有元組鍵的字典。這是非常不同的,因爲它意味着例如鍵「(0,1)」和「(0,2)」與「foo」和「bar」有很多共同之處。 – ThiefMaster

+0

爲什麼13,3應該在頂部或底部? 13和3都不是最小或最大的值。 –

+1

你能否讓你的問題更清楚?什麼是你想使用的排序算法?例如,(13,3)爲什麼會位於頂部? – jdotjdot

回答

1

是的,你可以寫任何你想要的功能作爲關鍵功能。例如,如果你想通過第二和第三要素的總和進行排序:

def keyfunc(item): 
    return sum(operator.itemgetter(2, 3)(item)) 

sorted(results, key=keyfunc) 

所以,如果你使用該功能爲您的keyfunc,以13爲一體的第三元素的第二個元素3項列表將按照值16排序。

不清楚如何排序這些元素,但可以更改keyfunc的主體以執行任何您想要的操作。

+0

如果「組合加權」涉及多個項目,'keyfunc()'可能不夠,請參見['@ jdotjdot's answer]中的collections.Counter'示例(http://stackoverflow.com/a/14035058/4279) – jfs

2

由於沒有任何其他的解釋,我在這裏做了一個總猜測,並且假設你實際想要做的是按列表中最後兩個鍵的產品排序,其次按照量級排序產品中的第一個元素。這是唯一能解釋爲什麼(13,3)成爲最佳結果的解釋。

在這種情況下,你會尋找這樣的事情:

sorted(results, key=lambda x: (x[-2]*x[-1], x[-2]), reverse=True) 

這會爲您提供以下種類:

[[13, 3], [13, 3], [13, 3], [1, 34], [29, 1], [10, 2], [16, 1], [11, 1]] 

另外,如果你真的在做什麼在這裏尋找的是按照它們出現在列表中的次數排列結果,我們可以使用collections.Counter。不幸的是,列表是不可散列的,所以我們會欺騙一下並將它們轉換爲元組作爲鍵。有辦法解決這個問題,但這是我現在最簡單的方式來展示我在說什麼。

import collections, json 
def sort_results(results): 
    c = collections.Counter([tuple(k) for k in results]) 
    return sorted(c, key=lambda x: c[x], reverse=True) 

這可以讓你:

[(13, 3), (1, 34), (16, 1), (29, 1), (11, 1), (10, 2)] 

謝謝J.F.塞巴斯蒂安對指出的元組可以用來代替str

+0

謝謝你的回答,這就是我一直在尋找的東西,我對Python很滿意,但我仍然在學習衆多可用的功能。代碼幾乎完成,只是幾個整潔和測試,我會有一個通用的搜索引擎搜索器,作爲旁邊的ps,我不是重新發明輪子,只是找不到一個實用程序,做了我所需要的 – user1928855

+0

您可以使用'tuple'而不是'str'來避免末尾的'json.loads':'Counter(map(tuple,results))'假設2D列表。 'key = c.get'可能會工作,而不是lambda。 – jfs

+0

@ J.F。謝謝,沒有意識到元組是可排除的。將更新。我正在考慮使用類似c.get的東西,但我只是認爲'lambda'能夠更清楚地說明發生了什麼。 – jdotjdot