Python:给定一个列表列表,创建一个按内部列表中出现次数排序的列表

Python:给定一个列表列表,创建一个按内部列表中出现次数排序的列表,python,list,Python,List,我有一份清单: [['a','b','c'], ['a'], ['a','b']] 我想对其进行排序并返回单个列表,以便输出如下所示: ['a', 'b', 'c'] ['a', 'b', 'c'] i、 e.按每个元素出现的次数排序。a出现3次,b出现两次,c出现一次 如何执行此操作?您可以使用为每个子列表中的每个元素保留一个计数器。像这样的, >>> from collections import Counter >>> lst = [['a','b

我有一份清单:

[['a','b','c'], ['a'], ['a','b']]
我想对其进行排序并返回单个列表,以便输出如下所示:

['a', 'b', 'c']
['a', 'b', 'c']
i、 e.按每个元素出现的次数排序。a出现3次,b出现两次,c出现一次

如何执行此操作?

您可以使用为每个子列表中的每个元素保留一个计数器。像这样的,

>>> from collections import Counter
>>> lst = [['a','b','c'], ['a'], ['a','b']]
>>> counts = Counter()
>>> for sublst in lst:
...     for ele in sublst:
...         counts[ele] += 1
... 
>>> [ele for ele, _ in counts.most_common()]
['a', 'b', 'c']

集合。计数器应执行以下操作:

>>> from collections import Counter
>>> lol = [['a','b','c'], ['a'], ['a','b']]
>>> c = Counter(elem for sublist in lol for elem in sublist)
>>> c
Counter({'a': 3, 'b': 2, 'c': 1})
子列表的
元素..
位只是一个扁平化的习惯用法。你可以用

>>> Counter(chain.from_iterable(lol))
Counter({'a': 3, 'b': 2, 'c': 1})
相反,在itertools导入链的
之后。然后您可以得到最常见的:

>>> c.most_common()
[('a', 3), ('b', 2), ('c', 1)]
然后按您喜欢的方式提取关键点:

>>> [x[0] for x in c.most_common()]
['a', 'b', 'c']
>>> zip(*c.most_common())[0]
('a', 'b', 'c')

使用
itertools.chain.from\u iterable()
首先展平列表,然后对元素进行计数

>>> from collections import Counter
>>> from itertools import chain
>>> [x[0] for x in Counter(chain.from_iterable(mylist)).most_common())
['a', 'b', 'c']
使用,以及:

输出:

['a', 'b', 'c']
注意:当您要计算列表中某些项目的频率时,请记住使用
计数器
,这非常有用。

此功能:

LoL= [['a','b','c'], ['a'], ['a','b']]     

d={}
for e in [i for sub in LoL for i in sub]:
    d[e]=d.setdefault(e,0)+1

print sorted(d, key=d.get, reverse=True)  
印刷品:


在黑暗中拍摄,但可能会创建一个
集合。计数器
对象并使用
排序
最常见()[1]
作为键。谢谢大家的评论。我现在明白这是怎么回事了!这不会像写的那样起作用——你不能保证结果会按照OP的要求排序。试试:zip(*Counter(chain*(mylist)).most_common())[0]为什么要使用
chain.from_iterable(data)
vs
chain(*data)
?@dansalmo:我认为这是因为“应该有一种显而易见的方法”。我认为连锁。从iterable开始是做这件事的标准方式。@Haidro:是的,它们几乎是一样的。这就是为什么我投了你的票;)@Haidro:是的,我在建立我的引用之后看到了这一点,然后实际上更改了它以显示您的[0]引用。我确实自己对dir()进行了修补,以找到最常见的方法,但我没有意识到这一点,它已经出现在该线程的许多答案中。我也喜欢@DSM答案中的
zip(*c.most_common())[0]
['a', 'b', 'c']
from collections import Counter
import operator
mlist= [['a','b','c'], ['a'], ['a','b']]
elist= [x for x,y in sorted(
    Counter([l for s in mlist for l in s]).iteritems(),
    key=operator.itemgetter(1),reverse=True)]
print elist