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)
vschain(*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