2014-05-20 127 views
1

我試圖用出現的頻率進行排序的Python列表項的列表排序的目錄列表在Python 的無序列表看起來是這樣的:通過頻率

a=[  ['item1', 'item2', 'element2'], 
     ['item3', 'item4', 'element3'], 
     ['item5', 'item6', 'element1'], 
     ['item7', 'item8', 'element3']] 

我想按列表的第三個元素的頻率排序。所以,排序後的結果列表,看起來像這樣:

result = [ ['item3', 'item4', 'element3'], 
      ['item7', 'item8', 'element3'], 
      ['item1', 'item2', 'element2'], 
      ['item5', 'item6', 'element1']] 

我不是Python的專家。任何想法,如何做?

回答

2

你必須先收集頻率;一個collections.Counter() object會做得很好。然後你可以看一下頻率和順序由:

from collections import Counter 

freq = Counter(item[-1] for item in a) 
result = sorted(a, key=lambda i: freq[i[-1]], reverse=True) 

這裏freq持有計數每個嵌套列表的最後一個元素,我們再使用排序關鍵字,按相反的順序(最常見的排序第一)。

演示:

>>> from collections import Counter 
>>> a=[  ['item1', 'item2', 'element2'], 
...   ['item3', 'item4', 'element3'], 
...   ['item5', 'item6', 'element1'], 
...   ['item7', 'item8', 'element3']] 
>>> freq = Counter(item[-1] for item in a) 
>>> sorted(a, key=lambda i: freq[i[-1]], reverse=True) 
[['item3', 'item4', 'element3'], ['item7', 'item8', 'element3'], ['item1', 'item2', 'element2'], ['item5', 'item6', 'element1']] 
>>> from pprint import pprint 
>>> pprint(_) 
[['item3', 'item4', 'element3'], 
['item7', 'item8', 'element3'], 
['item1', 'item2', 'element2'], 
['item5', 'item6', 'element1']] 
+0

我可以實現這使用operator.itemgetter而不是lamba表達式? – iamdeowanshi

+0

@iamdeowanshi不,這使用嵌套索引,而'itemgetter()'實例在這裏不能達到相同的結果。 –

+0

如果我們要使用正常的嵌套列表,可以使用itemgetter,那麼爲什麼不使用頻率排序嵌套列表 – iamdeowanshi

0

看看collections.Counter

例子:

wordlist = ['foo', 'bar', 'foo', 'baz'] 
import collections 
counter = collections.Counter(wordlist) 
counter.most_common() 

回報:

[('foo', 2), ('baz', 1), ('bar', 1)] 
0

我覺得沒有必要導入櫃檯或其他任何東西,只是定義將只返回一個列表的最後一個元素你自己的關鍵作用,所以使基於排序該元素......

因此,你可以使用「分類」與鍵功能last_element(您定義)是這樣的:

def last_element(x): return x[-1] 

sorted(a, key=last_element, reverse=True) 

,你會得到:

[['item3', 'item4', 'element3'], ['item7', 'item8', 'element3'], ['item1', 'item2', 'element2'], ['item5', 'item6', 'element1']] 

如果您不想定義一個新的功能,你可以使用拉姆達(類似於如圖另一個答案),所以只有一行的解決辦法是:

sorted(a, key=lambda x: x[-1], reverse=True)