按频率在Python中排序列表的列表

1 投票
3 回答
1058 浏览
提问于 2025-04-18 07:06

我正在尝试用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不是很熟悉,有没有人能告诉我该怎么做?

3 个回答

0

我觉得没必要导入Counter或者其他东西,只需要定义一个自己的关键函数,这个函数只返回列表的最后一个元素,这样就可以根据这个元素来排序了...

所以,你可以像这样使用'sorted'函数,并传入你定义的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']]

如果你不想定义一个新的函数,可以用lambda表达式(和另一个回答中展示的类似),这样一行代码就可以解决问题:

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

看看这个 collections.Counter 的文档吧。

举个例子:

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

返回结果是:

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

你首先需要收集频率;一个 collections.Counter() 对象 可以很好地完成这个任务。然后你可以根据频率来查找和排序:

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

撰写回答