按频率对Python中的List列表进行排序

时间:2014-05-20 14:29:17

标签: python list sorting

我试图按照出现的频率对Python中的列表项列表进行排序 未排序的列表如下所示:

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

我想按列表第3个元素的频率排序。因此,排序后的结果列表看起来像这样:

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

我不是Python的专家。任何想法,怎么做?

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:0)

查看collections.Counter

示例:

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

返回:

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

答案 2 :(得分:0)

我认为不需要导入Counter或其他任何东西,只需定义自己的键函数,它只返回列表的最后一个元素,以便根据该元素进行排序......

因此,您可以使用关键函数last_element(您定义的)使用'sorted',如下所示:

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']]

如果您不想定义新函数,可以使用lambda(类似于另一个答案中所示),因此只需一行的解决方案就是:

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