如何在元素列表中找到最大的数字,可能是非唯一的?

Posted

技术标签:

【中文标题】如何在元素列表中找到最大的数字,可能是非唯一的?【英文标题】:How to find the largest number(s) in a list of elements, possibly non-unique? 【发布时间】:2019-08-08 12:30:26 【问题描述】:

这是我的程序,

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]

【问题讨论】:

第 8 行带缩进 您可以使用字典将最大数量及其计数存储为 item_no = ,如果您的最大值与 item_no 中的原始值不同,则重新初始化并添加该项目并添加计数 =1 (“Band”可能是“Bad”的拼写错误) @tripleee 确实。靶心! 如答案所示,使用列表推导而不是循环来做这件事更像 Pythonic。但是如果你使用循环遍历列表,一个风格提示:不要使用相同的变量名称i 既用于索引i in range(5),也用于项目/值:for i in item_no。最好做for no in item_no 【参考方案1】:

只需使用maxcount 获得最大值,然后将两者结合到一个列表理解中。

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 进行初始化。

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

【讨论】:

@user11206537 我有点看到了这一点。知道什么是更好的方法仍然具有一定的价值。玩得开心! 您可能希望以小于0 的数字开头。 @user11206537 要获取索引,您可以稍微修改代码并在item_no 上使用enumerate。当您循环时,将索引存储在第二个列表中,就像您为最大值所做的那样。看看this @EricDuminil 导入 math.inf 并使用它似乎有点矫枉过正。我将把它留给 OP。他可能只需要处理自然数列表。对于寻求更好解决方案的人,他们可以使用没有这些缺点的第一个sn-p。 我对python不太熟悉——如果要在循环之后打印结果,第二个解决方案中的high是否需要在循环之前定义?【参考方案2】:

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

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

输出:

8,8

print 中的* 运算符用于解包值,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

您可能会检查numbers[3] 等于biggestnumbers[4] 等于biggest

【讨论】:

请注意,您的解决方案总共调用了maxlen(numbers)。将其存储在列表之外,然后使用它会更好。 @Ev.Kounis 我假设 Python 解释器对此进行了优化,不是吗? @user1717828 不,它没有。 @Ev.Kounis,哦,伙计,我不相信这一点,所以我测试了一下。 python -m timeit "numbers = [5, 6, 7, 8, 8]; max_number = max(numbers); maxnumbers = [i for i in numbers if i==max_number]" 是理解中最大计算时的两倍。使用带有编译器的语言,我已经被宠坏了。 @user1717828 你应该期望这种差异随着更大的列表而飙升。试试numbers = [random.randint(0, 500) for _ in range(10000)]【参考方案3】:

你可以做得更短:

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]

【讨论】:

最后一个问题,如何在item_no中找到结果的索引? 这是the fastest out of the SO answers provided。但是它可以更快。【参考方案4】:

    统计出现的最大次数

    遍历列表以打印计数范围的最大值 (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】:

这个问题可以在一行中解决,通过找到一个等于最大值的项目: 提高性能在 var 中存储最大值 mvalue=max(item_no) [i for i in item_no if i==Mvalue]

【讨论】:

如何在item_no中找到结果的索引? 通过enumerate函数我们可以得到索引位置:[i for i, val in enumerate(item_no) if val in result] 但是max不是被调用了n次吗?效率不高。【参考方案6】:

我认为如果我们在一次迭代中评估数组中的max 及其count 会更好

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([])) # []

试试看!!

【讨论】:

@user11206537 您是否测量并比较了解决方案之间的效率。可以和我们分享一下吗? 这种解决方案是我学校项目中真正需要的解决方案,我的老师认为它是一种非常有效的解决方案。这段代码也是按照我目前的编程风格写的,这正是我想要的。 仅供参考,这是我计时的答案has the second worst performance。【参考方案7】:

我认为不可能只用一行找到所有最大数字但是它会有点用首先我们将列表按升序排序然后这样做

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)]

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

【讨论】:

只打印最大值,而不是包含可能重复的最大值实例的列表,如问题中所要求的那样。 我制作了打印所有最大数字的程序,所以要开心:) 好多了。它比其他解决方案效率低,需要二次时间(用于排序)而不是线性时间,但您提出了一个有趣的替代方案和简单的解决方案。 如果你想让语法更紧凑,你可以像这样使范围等效:range(ind,len(yourList))。您还可以用切片完全替换循环:print(yourList[ind:]) 将创建一个切片,其中包含从 ind 到结尾的 yourList 中的元素。 我添加了另一种方法。所以,看看它是否对你有帮助

以上是关于如何在元素列表中找到最大的数字,可能是非唯一的?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有最大元素的唯一键数组?

如何迭代列表中的每个元素并将其与另一个元素相加以找到一个数字?

在 python 中,如何有效地找到列表中不一定相邻的最大连续数字集?

如何确定一个数字是不是是列表中的最大元素 - 使用 Racket

如何在指数级大列表中找到第 k 个最大的元素?

如何找到列表中两个元素的最大乘积?