Python 序列中最大的3个数字
我试图找出序列中最大的3个值,但从我的代码中,我不明白如果我把它们放入最大的3([9,6,4,1,2,3,10,8,7]),它会给出[6,9,10]而不是[8,9,10]的答案。根据我的理解,根据我的代码,我将让最大的_3是序列中的某个随机数,如果该数与最大的_2和最大的值不同,它将替换当前最大的_3数。但是从这个代码来看,如果有一个重复的数字,我的代码将不起作用。如何重写代码,使代码能够找出序列中最大的三个数字,并允许重复最大的数字 我可以创建一个元组来返回我的答案和一个列表,但不允许修改原始序列Python 序列中最大的3个数字,python,python-3.x,list,tuples,sequence,Python,Python 3.x,List,Tuples,Sequence,我试图找出序列中最大的3个值,但从我的代码中,我不明白如果我把它们放入最大的3([9,6,4,1,2,3,10,8,7]),它会给出[6,9,10]而不是[8,9,10]的答案。根据我的理解,根据我的代码,我将让最大的_3是序列中的某个随机数,如果该数与最大的_2和最大的值不同,它将替换当前最大的_3数。但是从这个代码来看,如果有一个重复的数字,我的代码将不起作用。如何重写代码,使代码能够找出序列中最大的三个数字,并允许重复最大的数字 我可以创建一个元组来返回我的答案和一个列表,但不允许修改原始
def largest_three(seq):
largest = seq[0]
largest_2 = seq[0]
largest_3 = seq[1]
answer = []
for num,item in enumerate(seq):
if seq[num] > largest:
largest = seq[num]
for num,item in enumerate(seq):
if seq[num] > largest_2 and not largest:
largest_2 = seq[num]
for num,item in enumerate(seq):
if seq[num] > largest_3 and not largest_2 and not largest:
largest_3 = seq[num]
answer.append(largest_3)
answer.append(largest_2)
answer.append(largest)
return answer
我建议使用
numpy.partition
,它完全满足您的需要。查看文档。对于一个相对简单的任务来说,这是大量的代码。实际上,您可以使用一些更简洁的代码来实现这一点,方法是对列表的副本进行排序,然后只返回最后三个值
oldList
参数显然就是要检查的列表。对于其他两个参数(默认为true),allowDupes
将在获取最高三个值时保留重复项(否则将被删除),而highToLow
将以降序(否则升序)返回最高项:
正如预期的那样,这将带来:
(10, 9, 8)
(10, 9, 9)
(10, 9, 8)
(9, 9, 10)
(8, 9, 10)
此代码涵盖了除第一条之外的所有需求(如果您始终允许重复,则它甚至涵盖了该需求):
- 返回最大的三个值(是否重复)李>
- 不修改原始列表李>
- 只创建一个额外的列表和一个返回的元组(除非需要删除重复项,在这种情况下,它还会创建一个集合)
max=seq[0]
最大值2=序号[1]#此处的指数为0
最大值3=序列[2]#这里的指数是1
最大值
只要在整数不为0时返回true即可。您应该改为使用此选项:如果seq[num]>最大的_2和seq[num]!=最大的:
及
如果seq[num]>最大的_3和seq[num]!=最大_2和顺序[num]!=最大的:
def最大值_三(seq):
最大值=序号[0]
最大值2=序号[1]
最大值3=序号[2]
答案=[]
对于num,枚举中的项(seq):
如果seq[num]>最大值:
最大值=序号[num]
对于num,枚举中的项(seq):
如果seq[num]>最大_2和seq[num]!=最大的:
最大值2=序号[num]
对于num,枚举中的项(seq):
如果seq[num]>最大的_3和seq[num]!=最大_2和顺序[num]!=最大的:
最大值3=序号[num]
答案.附加(最大的3)
答案.追加(最大的2)
回答:追加(最大)
回覆
控制台:
>>最大的三个([9,6,4,1,2,3,10,8,7])
[8, 9, 10]
如果允许使用排序的
最简单的方法:
res=sorted([9,6,4,1,2,3,10,8,7],reverse=True)[:3]
如果对列表的前三个数字进行显式排序,则算法将正常工作。我猜你的意思是做最大的3=seq[2]
而不是seq[1]
。我想你的意思也是和seq[num]!=最大的
而不是最大的
(第三个循环也是如此)。如果我的答案对您有帮助,请告诉我,谢谢!如果最大的三个值不按顺序排列怎么办<代码>[10,7,6,5,3,2,1]-根据OP-应该返回[5,6,7]
而不是[6,7,10]
@Chase:“序列中最大的3个值”[10,7,6,5,3,2,1]
是6,7,10
,而不是5,6,7
。我不知道你为什么认为后者是正确的,OP根本没有提到那个案例。@Chase我想你误解了OP的意思。输入列表中提到的“序列”操作。如果不特别注意最大三个数字不在列表中的列表,sorted
方法将无法工作sequence@Chase,你需要解释清楚一点,因为排序是把它们按顺序排列的。@paxdiablo我认为顺序中的最大值意味着同样是数字的最大3个值order@Chase,我假设从你的评论到我的答案,你的意思是连续的,而不是数字顺序,因为100、200、300满足后者而不是前者。无论如何,我不认为这是正确的解释,OP只要求最大的三个值;(2)仅使用索引时枚举索引和键。但我很难投你反对票,因为这是一个问题:——)
(10, 9, 8)
(10, 9, 9)
(10, 9, 8)
(9, 9, 10)
(8, 9, 10)