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)
当然,与上述结果相同
注释
-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]
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 importingmath.inf
,使用它似乎有点过头了。我将把这留给OP。他可能只需要处理自然数列表。对于那些寻求更好解决方案的人,他们可以使用第一个没有这些缺点的代码片段。我对python不太熟悉——如果要在循环之后打印结果,是否需要在循环之前定义第二个解决方案中的high
?最后一个问题,如何在项目_no中找到结果的索引?这是。但是它可以更快。如何在项目_no中找到结果的索引?如何在项目_no中找到结果的索引?通过使用枚举函数,我们可以得到索引位置:[i for i,val in enumerate(item_no),如果val in result]但不是max
调用n次?无效。@user11206537您是否测量并比较了解决方案之间的效率。你能和我们分享一下吗?这种解决方案是我学校项目中实际需要的一部分,我的老师认为这是一个非常有效的解决方案。这段代码也是按照我当前的编程风格编写的,这正是我想要的。仅供参考,这是我计时的答案。它只打印最大值,而不是问题中要求的包含可能重复的最大值实例的列表。我让程序打印所有最大值