我试图按照出现的频率对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的专家。任何想法,怎么做?
答案 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)
示例:
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)