Python 如何在元素列表中找到最大数量(可能是非唯一的)?

Python 如何在元素列表中找到最大数量(可能是非唯一的)?,python,arrays,python-3.x,Python,Arrays,Python 3.x,这是我的节目 item_no = [] max_no = 0 for i in range(5): input_no = int(input("Enter an item number: ")) item_no.append(input_no) for no in item_no: if no > max_no: max_no = no high = item_no.index(max_no) print (item_no[high]) 输入示例:[

这是我的节目

item_no = []
max_no = 0
for i in range(5):
    input_no = int(input("Enter an item number: "))
    item_no.append(input_no)
for no in item_no:
    if no > max_no:
       max_no = no
high = item_no.index(max_no)
print (item_no[high])
输入示例:
[5,6,7,8,8]

输出示例:
8

如何更改程序以输出数组中相同的最高数字


预期输出:
[8,8]

只需使用
max
获取最大值,然后使用其
计数
,并将两者合并到一个列表中即可

item_no = [5, 6, 7, 8, 8]

max_no = max(item_no)
highest = [max_no for _ in range(item_no.count(max_no))]
print(highest)  # -> [8, 8]
请注意,如果最大值只出现一次,这将返回单个项目的列表


更接近您当前编程风格的解决方案如下:

item_no = [5, 6, 7, 8, 8]
max_no = 0  # Note 1 
for i in item_no:
    if i > max_no:
        max_no = i
        high = [i]
    elif i == max_no:
        high.append(i)
当然,与上述结果相同

注释

  • 我假设您只处理N*(1,2,…)个数字。如果不是这样,则应使用
    -math.inf
    初始化


  • 请注意,第二个代码段的效率比第一个低很多。Python允许您比这些显式的、类似fortran的循环更高效,并且当您正确使用它时,Python本身也更高效。

    您可以通过以下方式使用
    list
    理解该任务:

    numbers = [5, 6, 7, 8, 8]
    maxnumbers = [i for i in numbers if i==max(numbers)]
    print(*maxnumbers,sep=',')
    
    输出:

    8,8
    
    *
    打印中的操作员用于解包值,
    sep
    用于通知
    print
    使用什么分隔符:

    编辑:如果要获取最大值的索引并只调用一次
    max
    ,请执行以下操作:

    numbers = [5, 6, 7, 8, 8]
    biggest = max(numbers)
    positions = [inx for inx,i in enumerate(numbers) if i==biggest]
    print(*positions,sep=',')
    
    输出:

    3,4
    

    您可以检查
    数字[3]
    是否等于
    最大值
    数字[4]
    是否等于
    最大值
    ,您可以做得更短:

    item_no = [5, 6, 7, 8, 8]
    #compute once - use many times
    max_item = max(item_no)
    print(item_no.count(max_item) * [max_item])
    
    输出:

    [8, 8]
    
  • 计算最大数量的出现次数

  • 迭代列表以打印计数范围(1)的最大值

  • 因此

    item_no = [5, 6, 7, 8, 8]
    counter = item_no.count(max(item_no))      # 2
    print([max(item_no) for x in range(counter)])   
    
    [8, 8]
    
    输出

    item_no = [5, 6, 7, 8, 8]
    counter = item_no.count(max(item_no))      # 2
    print([max(item_no) for x in range(counter)])   
    
    [8, 8]
    

    这个问题可以在一行中解决,方法是找到一个等于最大值的项: 要提高性能,请在var中存储最大值 M值=最大值(项目编号)
    [如果i==Mvalue,则i为i项中的i否]
    我认为最好在一次迭代中评估数组中的
    max
    及其
    计数

    def maxs(iterable):
        max = None
        count = 0
        for index, value in enumerate(iterable):
            if index == 0 or value >= max:
                if value != max:
                    count = 0
                max = value
                count += 1
        return count * [max]
    
    
    print (maxs([5, 6, 7, 8, 8]))   # [8, 8]
    print (maxs([3, 2, 4, 5, 1, 2, 4, 5, 2, 5, 0])) # [5, 5, 5]
    print (maxs([])) # []
    

    试试看

    我认为不可能只用一行就找到所有的最大值,但这会有点效果。首先,我们将按升序对列表排序,然后执行此操作

    yourList = [7,7,76,4,54,4,5,234,5,56,7,234,34,234,234]
    
    yourList.sort()
    ind = yourList.index(max(yourList))
    for i in range(ind,ind+(len(yourList)-ind)):
        print(yourList[i])
    
    
    
    基本上,我们将得到第一个最大数的索引,然后我们将用列表的长度减去它,我们将得到要加多少索引才能得到所有的最大数

    这样做还有另一种方法

    lis = [1,2,3,12,12,1,12,3,4,5,6,12, 12]
    count = lis.count(max(lis))
    loop = [print(max(lis), end=" ") for i in range(count)]
    


    通过这种方式,我们将获得列表中出现的最大数量的次数,并在第8行打印该次数

    带缩进。您可以使用字典将最大数量及其计数存储为项目_no={},如果您的最大数量与项目_no中的原始数量不同,请重新初始化它并添加该项目,然后添加计数=1(“带”很可能是“Bad”的拼写错误。公牛眼!正如答案所示,使用列表理解而不是循环更符合Python。但是,如果使用循环遍历列表,样式提示是:对于范围(5)
    中的索引
    i,不要使用相同的变量名
    i
    ,对于项目/值,也不要使用
    作为项目编号中的i。对于项目中的no,最好执行
    。\u no
    请注意,您的解决方案调用
    max
    总共
    len(number)
    次。将它存储在列表之外,然后使用它会更好。@Ev.Kounis我想Python解释器会对此进行优化,不是吗?@user1717828不,不是。@Ev.Kounis,天哪,我不相信,所以我测试了它
    python-m timeit“numbers=[5,6,7,8,8];max_number=max(numbers);maxnumbers=[i代表i,如果i==max_number]”
    的速度是理解中最大计算速度的两倍。在编译器中使用语言,我被宠坏了。@user1717828,你应该预料到这种差异会随着更大的列表而急剧增加。用
    numbers=[random.randint(0500)for uuu.in-range(10000)]
    @user11206537试试看,我有点预见到了这一点。知道更好的方法是什么仍然有一些价值。玩得高兴您可能希望从小于
    0
    @user11206537的数字开始获取索引,您可以稍微修改代码,并在
    项目号上使用
    枚举
    。在循环过程中,将索引存储在第二个列表中,就像存储最大值一样。看看@EricDuminil importing
    math.inf
    ,使用它似乎有点过头了。我将把这留给OP。他可能只需要处理自然数列表。对于那些寻求更好解决方案的人,他们可以使用第一个没有这些缺点的代码片段。我对python不太熟悉——如果要在循环之后打印结果,是否需要在循环之前定义第二个解决方案中的
    high
    ?最后一个问题,如何在项目_no中找到结果的索引?这是。但是它可以更快。如何在项目_no中找到结果的索引?如何在项目_no中找到结果的索引?通过使用枚举函数,我们可以得到索引位置:[i for i,val in enumerate(item_no),如果val in result]但不是
    max
    调用n次?无效。@user11206537您是否测量并比较了解决方案之间的效率。你能和我们分享一下吗?这种解决方案是我学校项目中实际需要的一部分,我的老师认为这是一个非常有效的解决方案。这段代码也是按照我当前的编程风格编写的,这正是我想要的。仅供参考,这是我计时的答案。它只打印最大值,而不是问题中要求的包含可能重复的最大值实例的列表。我让程序打印所有最大值