如何在一个列表中的列表中找到最常见的元素?

3
我了解。
a = max(set(lst), key=lst.count)

将从列表中获取最常见的元素

但是如果不使用辅助函数,如何从列表的列表中获取最常见的元素?

例如:

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]

输出应该等于 1

当我尝试 a = max(set(lst), key=lst.count) 时,它会报错 builtins.TypeError: unhashable type: 'list'

请问有谁能帮助我吗?


你对于以下代码的输出结果会是什么呢:[['1', '2', '3', '4'], ['1', '1', '2', '2'], ['2', '2', '3', '4']] - Ashwini Chaudhary
“辅助函数”是什么意思?你的定义似乎包括Counter,但不包括maxset。你最好考虑避免O(N^2)的行为(例如在max(set(lst), key=list.count)中),而不是使用标准库。 - Paul Hankin
4个回答

4

有很多方法,但我想让您知道标准模块中有一些不错的工具可以处理这类问题,例如collections.Counter

In [1]: lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
In [2]: from collections import Counter
In [3]: from operator import itemgetter
In [4]: max((Counter(l).most_common(1)[0] for l in lst), key=itemgetter(1))[0]
Out[4]: '1'

或者,你可以(有点)使用当前的解决方案来处理每个子列表:

In [5]: max(((max(set(l), key=l.count), l) for l in lst),
   ...: key=lambda x: x[1].count(x[0]))[0]
Out[5]: '1'

非常感谢您提供的代码,但是您是否有其他不需要itemgetter或counter的函数?我的意思是只需要简单的Python编程,不需要任何from语句或import语句。 - EHMJ
2
好的Python代码利用了已经可用的优秀模块。你有什么理由要避免使用内置模块吗?这是作业吗? - David Cain
不,我会说这是作业的一部分,要求在不使用太多if语句的情况下缩短一个函数,这是Python课程的入门。 - EHMJ
@EricJung 嗯,我添加了另一个例子,部分使用了你发布的代码,但是第一个版本对我来说似乎更好。 - Lev Levitsky

4

将您的列表扁平化,然后在其上使用collections.Counter。然后使用Counter.most_common()方法获取一个元素及其出现次数元组列表,从高到低排序:

>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
>>> flattened_list = [elem for sublist in lst for elem in sublist]  
>>> flattened_list
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4']
>>>
>>> from collections import Counter
>>>
>>> counter = Counter(flattened_list)
>>> counter.most_common()
[('1', 6), ('3', 2), ('2', 2), ('4', 2)]
>>>
>>> counter.most_common(1)
('1', 6)

或者,您可以使用自己的方法从flatten列表中获取最常见的元素。

>>> max(set(flattened_list), key=flattened_list.count)
'1'

您也可以这样展开列表:-
>>> sum(lst, [])
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4']

因此,作为一行代码,您可以这样做:-
>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]

>>> max(set(sum(lst, [])), key=sum(lst, []).count)
'1'

当然,最后一个会创建两个列表,内容相同。

"most_common" 接受项目数量作为参数。 - Lev Levitsky

1

您需要使用chain(*lst)来展开列表,然后使用Counter(chain(*lst).most_common())来计算列表中每个元素的出现次数,并对结果进行排序。

from itertools import chain
from collections import Counter

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
sorted(Counter(chain(*lst)).most_common())[0][0]

1
尝试提供注释或解释。谢谢。 - Yes Barry

0
你可以使用 Counter 来查找最常见的元素,使用 chain 来迭代列表中的元素:
from collections import Counter
from itertools import chain

print Counter(val for val in chain.from_iterable(lst)).most_common(1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接