Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化Python代码以返回列表中出现次数最多的最小元素_Python_Python 3.x_List_Python 2.7 - Fatal编程技术网

优化Python代码以返回列表中出现次数最多的最小元素

优化Python代码以返回列表中出现次数最多的最小元素,python,python-3.x,list,python-2.7,Python,Python 3.x,List,Python 2.7,我正试图用Python解决HackerRanks的一个容易评级的问题。我的代码解决了5个测试用例中的4个,但是对于其中一个测试用例,我收到了一条错误消息,说超出了时间限制。请推荐优化此功能的方法。我是python的初学者,仍在努力理解itertools,但它似乎相当复杂 问题陈述: 给定一组鸟类目击事件,其中每个元素代表一个鸟类类型id,确定最常见类型的id。如果发现超过1种类型的ID超过最大数量,请返回它们的最小ID 样本输入:arr=[1,2,3,4,5,4,3,2,1,3,4] 样本输出:

我正试图用Python解决HackerRanks的一个容易评级的问题。我的代码解决了5个测试用例中的4个,但是对于其中一个测试用例,我收到了一条错误消息,说超出了时间限制。请推荐优化此功能的方法。我是python的初学者,仍在努力理解itertools,但它似乎相当复杂

问题陈述: 给定一组鸟类目击事件,其中每个元素代表一个鸟类类型id,确定最常见类型的id。如果发现超过1种类型的ID超过最大数量,请返回它们的最小ID

样本输入:arr=[1,2,3,4,5,4,3,2,1,3,4] 样本输出:3

我当前的代码:

def migratoryBirds(arr):
    d={}
    arr2=[]
    for i in range(len(arr)):
        d[arr[i]]=arr.count(arr[i])
    for i in d.keys():
        if d[i]==max(d.values()):
            arr2.append(i)
    return(min(arr2))
def migratoryBirds(arr):
最常用项=最大值(arr,键=arr.count)
打印(最常见的项目)
迁徙鸟类([1,2,3,4,5,4,3,2,1,3,4])#测试

由于使用
.count()
函数多次遍历整个数组,因此您的算法较慢。在第二个循环中,您还将使用max()函数多次查看字典。这导致了O(N^2)时间复杂度

要实现O(N)时间,您应该在数组中只为每个项添加1,然后根据最大总id/min id处理字典:

arr=[1,2,3,4,5,4,3,2,1,3,4]

counts = {}
for bird in arr: counts[bird] = counts.get(bird,0) + 1      # +1 per bird
result,_ = max(counts.items(),key=lambda kv:(kv[1],-kv[0])) # max total / min id

print(result) # 3

我也是python中的一个新条目! 我是这样解决的……也许这不是练习的范围,也许这将是您所见过的运行中最糟糕的代码……但它可以运行!:D

arr=[1,2,3,4,5,4,3,2,1,3,4]

import pandas as pd
a=pd.Series(arr)

x=a.value_counts()==a.value_counts().max()
print( x[x].tail(1).index[0] )

我投票结束这个问题,因为这个问题可能属于另一个堆栈站点-可能有助于
集合。计数器
会更简单:您只需给它一个序列,它就会计算计数。@Masklin,确实如此,但我需要说明我的观点,即每只鸟只添加1个,而不是调用sum()每一次。计数器会将那个部分提取得太多。您应该包括您期望的输出。“出现频率最高的最小元素”我想你的意思是,最高频率是3,3和4都出现3次。那么答案是3,因为这是出现次数最多的最小数字?