Python 列表的查找模式

Python 列表的查找模式,python,Python,我正在写一个函数,计算一个或多个数字列表的模式 如果输入是[52,99,37,86,99,99,99,37,37],输出应该是[37,99]。正如您所看到的,较小的数字应该首先出现,但我的代码不会这样做。有人能修改我的代码吗 def mode(L): most = max(list(map(L.count, L))) return list(set(filter(lambda x: L.count(x) == most, L))) 对列表进行排序 def mode(L):

我正在写一个函数,计算一个或多个数字列表的模式

如果输入是[52,99,37,86,99,99,99,37,37],输出应该是[37,99]。正如您所看到的,较小的数字应该首先出现,但我的代码不会这样做。有人能修改我的代码吗

def mode(L):
    most = max(list(map(L.count, L)))
    return list(set(filter(lambda x: L.count(x) == most, L)))
对列表进行排序

def mode(L):
    most = max(list(map(L.count, L)))
    return sorted(list(set(filter(lambda x: L.count(x) == most, L))))
更新 注意:这是一种非常低效的模式计算方法。在其他答案中有更多的性能解决方案。这个答案只关注OP所问的问题。请勿在生产中使用此代码。 另请参阅关于此代码其他改进的注释。

对列表进行排序

def mode(L):
    most = max(list(map(L.count, L)))
    return sorted(list(set(filter(lambda x: L.count(x) == most, L))))
更新 注意:这是一种非常低效的模式计算方法。在其他答案中有更多的性能解决方案。这个答案只关注OP所问的问题。请勿在生产中使用此代码。
另请参阅有关此代码其他改进的注释。

另一种解决方案是使用collections.Counter

从收款进口柜台 nums=[52,99,37,86,99,99,99,37,37] c=计数器 最高频率=最大值 mod=[n代表n,SortedDC中的频率。如果频率==最高频率,则为项目] 打印模组 输出:

[37, 99]
如果您只需要一项,也可以使用:

nums = [52, 99, 37, 86, 99, 99, 99, 37, 37, 37]
c = Counter(nums)
print(max(c))
其中打印:

99

另一种解决方案是使用collections.Counter

从收款进口柜台 nums=[52,99,37,86,99,99,99,37,37] c=计数器 最高频率=最大值 mod=[n代表n,SortedDC中的频率。如果频率==最高频率,则为项目] 打印模组 输出:

[37, 99]
如果您只需要一项,也可以使用:

nums = [52, 99, 37, 86, 99, 99, 99, 37, 37, 37]
c = Counter(nums)
print(max(c))
其中打印:

99

你在这里使它在计算上相当昂贵。A.伯爵。。需要线性时间,使此算法为二次型

您可以使用此处的计数器对列表执行单次传递,然后获得最常见的元素,如:

from collections import Counter
from operator import itemgetter
from itertools import groupby

def mode(L):
    _, common = next(groupby(Counter(L).most_common(), itemgetter(1)))
    return sorted(map(itemgetter(0), common))

如果列表中的元素可以有效地进行散列,那么它将以线性时间运行。

您在这里使它在计算上非常昂贵。A.伯爵。。需要线性时间,使此算法为二次型

您可以使用此处的计数器对列表执行单次传递,然后获得最常见的元素,如:

from collections import Counter
from operator import itemgetter
from itertools import groupby

def mode(L):
    _, common = next(groupby(Counter(L).most_common(), itemgetter(1)))
    return sorted(map(itemgetter(0), common))

如果列表中的元素可以有效地进行散列,则此操作将以线性时间运行。

但集合是无序的。你为什么认为结果应该是有序的?你用set就失去了秩序。请尝试使用列表集[b,a]查看它。使用计数器。最常见的是,这将是一种更常见的方法efficient@Alex我赢回来了。我认为顺序取决于实现。如果将来有人用谷歌搜索,一旦Python 3.8出炉,答案就变成了导入统计;sortedstatistics.MultiMediaBut集合无序。你为什么认为结果应该是有序的?你用set就失去了秩序。请尝试使用列表集[b,a]查看它。使用计数器。最常见的是,这将是一种更常见的方法efficient@Alex我赢回来了。我认为顺序取决于实现。如果将来有人用谷歌搜索,一旦Python 3.8出炉,答案就变成了导入统计;sortedstatistics.MultimelCounter.most_common返回从最高计数到最低计数的项目迭代器。为True,但需要指定所需数量。选择最常见的方法需要手动迭代。否。见@WillemVanOnsem的答案。我独立地、缓慢地提出了同样的想法。不过,groupby还是在列表中迭代。我的意思是没有过滤就没有直接的解决方案。groupby创建一个迭代器。它不进行迭代。调用next时,它迭代并调用项上的键函数,直到迭代器的键函数的返回值更改或迭代器耗尽。所以在这里,为了创建两个的第一个分组,它使用最常见的前三个项。因为第三个项目的计数不同,所以它将前两个项目分组并作为一个组返回。不进一步迭代由返回的迭代器。most_common已完成。Counter.most_common返回从最高计数到最低计数的项目迭代器。True,但需要指定所需的数量。选择最常见的方法需要手动迭代。否。见@WillemVanOnsem的答案。我独立地、缓慢地提出了同样的想法。不过,groupby还是在列表中迭代。我的意思是没有过滤就没有直接的解决方案。groupby创建一个迭代器。它不进行迭代。调用next时,它迭代并调用项上的键函数,直到迭代器的键函数的返回值更改或迭代器耗尽。所以在这里,为了创建两个的第一个分组,它使用最常见的前三个项。因为第三个项目的计数不同,所以它将前两个项目分组并作为一个组返回。没有对返回的迭代器进行进一步的迭代。大多数情况下都已完成。如果将来有人在谷歌上搜索此项,请使用Pyth
在3.8中,答案变成了进口统计;如果将来有人用谷歌搜索这个,一旦Python 3.8出炉,答案就变成了导入统计;sortedstatistics.multimodel您可以删除这两行中的列表。他们没有为你做任何事。max将使用map迭代器,而sorted将愉快地使用集合。请注意,这的性能非常糟糕。考虑做ListMaPL.Calt,L,在10项列表中,L计数被称为10次,并且必须迭代超过10项来进行计数。这是10个项目的100次10*10次访问。10:1. 但如果列表中有100个项目,那么它的访问量将达到10000 100*100。1000:1. 因此,通过将列表增加10倍,迭代的费用增加了100倍。这是二次增长。在我的电脑上,当L变成10000个项目时,它会变得缓慢,而其他的答案仍在继续进行。“StevenRumbalski,我同意你的两个评论——MatthewLee,你可能想同时考虑这两个问题。然而,我的回答集中在马修利所问的具体问题上。我现在在我的回答中加入了一个注释,以供将来的读者阅读。你们可以去掉这两行的列表。他们没有为你做任何事。max将使用map迭代器,而sorted将愉快地使用集合。请注意,这的性能非常糟糕。考虑做ListMaPL.Calt,L,在10项列表中,L计数被称为10次,并且必须迭代超过10项来进行计数。这是10个项目的100次10*10次访问。10:1. 但如果列表中有100个项目,那么它的访问量将达到10000 100*100。1000:1. 因此,通过将列表增加10倍,迭代的费用增加了100倍。这是二次增长。在我的电脑上,当L变成10000个项目时,它会变得缓慢,而其他的答案仍在继续进行。“StevenRumbalski,我同意你的两个评论——MatthewLee,你可能想同时考虑这两个问题。然而,我的回答集中在马修利所问的具体问题上。我现在在我的回答中加入了一个注释,以供将来的读者阅读。