按频率在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不是很熟悉,有没有人能告诉我该怎么做?
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']]