Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中按频率对列表进行排序_Python_List_Sorting - Fatal编程技术网

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

在Python中按频率对列表进行排序,python,list,sorting,Python,List,Sorting,我试图按照出现的频率对Python中的列表项列表进行排序 未排序的列表如下所示: a=[ ['item1', 'item2', 'element2'], ['item3', 'item4', 'element3'], ['item5', 'item6', 'element1'], ['item7', 'item8', 'element3']] 我想按列表中第三个元素的频率排序。因此,排序后的结果列表将如下所示: result = [ [

我试图按照出现的频率对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专家。有什么想法,怎么做吗?

看看

例如:

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)