在Python中按频率对列表进行排序
我试图按照出现的频率对Python中的列表项列表进行排序 未排序的列表如下所示:在Python中按频率对列表进行排序,python,list,sorting,Python,List,Sorting,我试图按照出现的频率对Python中的列表项列表进行排序 未排序的列表如下所示: a=[ ['item1', 'item2', 'element2'], ['item3', 'item4', 'element3'], ['item5', 'item6', 'element1'], ['item7', 'item8', 'element3']] 我想按列表中第三个元素的频率排序。因此,排序后的结果列表将如下所示: result = [ [
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专家。有什么想法,怎么做吗?看看
例如:
wordlist = ['foo', 'bar', 'foo', 'baz']
import collections
counter = collections.Counter(wordlist)
counter.most_common()
返回:
[('foo', 2), ('baz', 1), ('bar', 1)]
你必须先收集频率;a会做得很好。然后,您可以通过以下方式查找频率和顺序:
from collections import Counter
freq = Counter(item[-1] for item in a)
result = sorted(a, key=lambda i: freq[i[-1]], reverse=True)
这里freq
保存每个嵌套列表中最后一个元素的计数,然后使用排序键,顺序相反(最频繁的排序在前)
演示:
我认为不需要导入计数器或其他任何东西,只需定义自己的键函数,它将返回列表的最后一个元素,以便根据该元素进行排序 因此,您可以将“sorted”与键函数last_元素(您定义的)一起使用,如下所示:
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)
我可以用operator.itemgetter而不是lamba表达式来实现这一点吗?@iamdeowanshi否,这使用嵌套索引,而
itemgetter()实例在这里无法实现相同的结果。如果我们使用普通的嵌套列表,itemgetter可以用于排序嵌套列表,为什么不使用frequency@iamdeowanshi:这是因为itemgetter(value)
对象本质上与lambda item:item[value]
相同。这里的lambda与之不同。@iamdeowanshi:i[-1]
是被排序对象的最后一个元素freq[…]
是Counter()映射中的查找,因此将元素映射到它们的频率。因此,对于每个已排序的['itemN'、'itemO'、'itemP
]`列表,将查找'itemP'
的频率并返回到sort on。
sorted(a, key=lambda x: x[-1], reverse=True)