2014-05-20 79 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)