具有相同数量实例的Python max

具有相同数量实例的Python max,python,max,instances,Python,Max,Instances,我有一份清单: hello = ['1', '1', '2', '1', '2', '2', '7'] 我想显示列表中最常见的元素,因此我使用: m = max(set(hello), key=hello.count) 然而,我意识到列表中可能有两个元素出现的频率相同,比如上面列表中的1和2。Max仅输出最大频率元素的第一个实例 什么样的命令可以检查列表以查看两个元素是否都具有最大的实例数,如果是,则同时输出它们?我在这里不知所措。使用与您当前类似的方法,您将首先找到最大计数,然后查找每个具

我有一份清单:

hello = ['1', '1', '2', '1', '2', '2', '7']
我想显示列表中最常见的元素,因此我使用:

m = max(set(hello), key=hello.count)
然而,我意识到列表中可能有两个元素出现的频率相同,比如上面列表中的1和2。Max仅输出最大频率元素的第一个实例


什么样的命令可以检查列表以查看两个元素是否都具有最大的实例数,如果是,则同时输出它们?我在这里不知所措。

使用与您当前类似的方法,您将首先找到最大计数,然后查找每个具有该计数的项目:

>>> m = max(map(hello.count, hello))
>>> set(x for x in hello if hello.count(x) == m)
set(['1', '2'])
或者,您可以使用nice类,该类可用于高效地计算数据:

>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> from collections import Counter
>>> c = Counter(hello)
>>> c
Counter({'1': 3, '2': 3, '7': 1})
>>> common = c.most_common()
>>> common
[('1', 3), ('2', 3), ('7', 1)]
然后,您可以使用列表理解来获取具有最大计数的所有项目:

>>> set(x for x, count in common if count == common[0][1])
set(['1', '2'])
输出:

The list: ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2']
Counter({'1': 3, '2': 3, '10': 1, '5': 1, '7': 1, '6': 1})
The key is 10 , The count is 1
My max is: 0
The key is 1 , The count is 3
My max is: 1
The key is 2 , The count is 3
My max is: 3
The key is 5 , The count is 1
My max is: 3
The key is 7 , The count is 1
My max is: 3
The key is 6 , The count is 1
My max is: 3
['1', '2']
我写了这个简单的程序,我想它也可以工作。在我进行搜索之前,我不知道
most_common()
函数。我认为这将返回尽可能多的最频繁元素,它通过比较最大频繁元素来工作,当我看到一个更频繁的元素时,它将删除结果列表,并追加一次;或者,如果它是相同的频率,它只是附加到它。并继续运行,直到整个计数器被遍历。

编辑:已更改的解决方案

>>> from collections import Counter
>>> from itertools import groupby
>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(),
                               lambda x: x[1]))
>>> print [num for num, count in max_nums]
['1', '2']

当有3个重复的数字时,比如['1','1','2','2','8','7','7'],情况如何。。。你的剧本不适合这个。谢谢,否则这个解决方案很好。@james:无法复制,它返回
set(['1','2','7'])
给我两个代码片段。啊,是的,没问题,它现在对我来说工作得很好。非常感谢。您的第一个解决方案的第二行也可以缩短<代码>{x代表x在hello if hello.count(x)=m}@jam:是的,对,出于某种原因,我通常不使用集合理解。但我还是很喜欢听写理解。。。对于这篇文章,我将保持原样,因为这样它也可以在2.6中工作(这仍然是一些Linux发行版的默认版本…),这是一个很好的例子!它展示了如果你不只是在寻找最简单的方法的话,你自己如何做到这一点。我也学到了一些东西,我学会了
most_common()。所以这对我们所有人来说都是双赢的,干杯+1、好的清洁溶液。最后一行可以稍微简化为
d[max(d)]
:)谢谢,现在它看起来更漂亮了:d这个方法的问题是它是O(n**2)<代码>顺序。计数
为O(n),并且对序列中的每个项目执行一次。
计数器
方法或手工编码的等效方法为O(n)——每个项目的操作数与序列中的项目数无关。注。我知道
计数器
更适合这些操作,只是觉得这个方法看起来很干净:)
>>> from collections import Counter
>>> from itertools import groupby
>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(),
                               lambda x: x[1]))
>>> print [num for num, count in max_nums]
['1', '2']