Python 获取列表中X最大数的索引
请不要使用除len或range之外的内置设备。我在准备期末考试 这里有一个例子来说明我的意思Python 获取列表中X最大数的索引,python,algorithm,Python,Algorithm,请不要使用除len或range之外的内置设备。我在准备期末考试 这里有一个例子来说明我的意思 def find_numbers(x, lst): lst = [3, 8, 1, 2, 0, 4, 8, 5] find_numbers(3, lst) # this should return -> (1, 6, 7) 我没有完全尝试过……无法找到最好的解决方法: def find_K_highest(lst, k): newlst = [0] * k maxvalue = lst
def find_numbers(x, lst):
lst = [3, 8, 1, 2, 0, 4, 8, 5]
find_numbers(3, lst) # this should return -> (1, 6, 7)
我没有完全尝试过……无法找到最好的解决方法:
def find_K_highest(lst, k):
newlst = [0] * k
maxvalue = lst[0]
for i in range(len(lst)):
if lst[i] > maxvalue:
maxvalue = lst[i]
newlst[0] = i
从列表中选择前3个数字。最大值的最小值如下所示。在你的情况下:3,8,1。他们的指数是0,1,2。构建3,0,8,1,1,2对 现在按最大值的大小对它们进行排序:8,1,3,0,1,2 使用这个初始列表,您可以递归地遍历列表的其余部分。将最小值1与列表2、3中的下一个元素进行比较。如果它较大,则将其排序到列表8,1,3,0,2,3中,并丢弃最小的 一开始,前三名中有很多变化,但后来,它们变得很少了。当然,你必须记下最后一个位置3、4、5。。。当穿越的时候也一样 前N个元素的插入排序应该非常有效
但不需要报告索引 从列表中选取前3个数字。最大值的最小值如下所示。在你的情况下:3,8,1。他们的指数是0,1,2。构建3,0,8,1,1,2对 现在按最大值的大小对它们进行排序:8,1,3,0,1,2 使用这个初始列表,您可以递归地遍历列表的其余部分。将最小值1与列表2、3中的下一个元素进行比较。如果它较大,则将其排序到列表8,1,3,0,2,3中,并丢弃最小的 一开始,前三名中有很多变化,但后来,它们变得很少了。当然,你必须记下最后一个位置3、4、5。。。当穿越的时候也一样 前N个元素的插入排序应该非常有效
但不需要报告索引 我不知道发布解决方案是否好,但这似乎有效:
def find_K_highest(lst, k):
# escape index error
if k>len(lst):
k=len(lst)
# the output array
idxs = [None]*k
to_watch = range(len(lst))
# do it k times
for i in range(k):
# guess that max value is at least at idx '0' of to_watch
to_del=0
idx = to_watch[to_del]
max_val = lst[idx]
# search through the list for bigger value and its index
for jj in range(len(to_watch)):
j=to_watch[jj]
val = lst[j]
# check that its bigger that previously finded max
if val > max_val:
idx = j
max_val = val
to_del=jj
# append it
idxs[i] = idx
del to_watch[to_del]
# return answer
return idxs
PS我试图解释每一行代码。我不知道发布解决方案是否好,但这似乎有效:
def find_K_highest(lst, k):
# escape index error
if k>len(lst):
k=len(lst)
# the output array
idxs = [None]*k
to_watch = range(len(lst))
# do it k times
for i in range(k):
# guess that max value is at least at idx '0' of to_watch
to_del=0
idx = to_watch[to_del]
max_val = lst[idx]
# search through the list for bigger value and its index
for jj in range(len(to_watch)):
j=to_watch[jj]
val = lst[j]
# check that its bigger that previously finded max
if val > max_val:
idx = j
max_val = val
to_del=jj
# append it
idxs[i] = idx
del to_watch[to_del]
# return answer
return idxs
PS我试着解释每一行代码。你能使用列表方法吗?e、 g.追加、排序、索引?。如果是这样的话,我想这应该行得通
def find_numbers(n,lst):
ll=lst[:]
ll.sort()
biggest=ll[-n:]
idx=[lst.index(i) for i in biggest] #This has the indices already, but we could have trouble if one of the numbers appeared twice
idx.sort()
#check for duplicates. Duplicates will always be next to each other since we sorted.
for i in range(1,len(idx)):
if(idx[i-1]==idx[i]):
idx[i]=idx[i]+lst[idx[i]+1:].index(lst[idx[i]]) #found a duplicate, chop up the input list and find the new index of that number
idx.sort()
return idx
lst = [3, 8, 1, 2, 0, 4, 8, 5]
print find_numbers(3, lst)
你能用列表法吗?e、 g.追加、排序、索引?。如果是这样的话,我想这应该行得通
def find_numbers(n,lst):
ll=lst[:]
ll.sort()
biggest=ll[-n:]
idx=[lst.index(i) for i in biggest] #This has the indices already, but we could have trouble if one of the numbers appeared twice
idx.sort()
#check for duplicates. Duplicates will always be next to each other since we sorted.
for i in range(1,len(idx)):
if(idx[i-1]==idx[i]):
idx[i]=idx[i]+lst[idx[i]+1:].index(lst[idx[i]]) #found a duplicate, chop up the input list and find the new index of that number
idx.sort()
return idx
lst = [3, 8, 1, 2, 0, 4, 8, 5]
print find_numbers(3, lst)
伙计。你有两种方法可以做到这一点 第一种方法是聪明。你的老师出去了。她在寻找的是递归。您可以不使用递归和内置函数或方法编写:
#!/usr/bin/python
lst = [3, 8, 1, 2, 0, 4, 8, 5]
minval=-2**64
largest=[]
def enum(lst):
for i in range(len(lst)):
yield i,lst[i]
for x in range(3):
m=minval
m_index=None
for i,j in enum(lst):
if j>m:
m=j
m_index=i
if m_index:
largest=largest+[m_index]
lst[m_index]=minval
print largest
这很有效。它很聪明。带上那个老师!!!但是,你会得到C或更低
或者——你可以成为老师的宠儿。按她想要的方式写。您将需要列表的递归最大值。剩下的很简单
def max_of_l(l):
if len(l) <= 1:
if not l:
raise ValueError("Max() arg is an empty sequence")
else:
return l[0]
else:
m = max_of_l(l[1:])
return m if m > l[0] else l[0]
print max_of_l([3, 8, 1, 2, 0, 4, 8, 5])
伙计。你有两种方法可以做到这一点 第一种方法是聪明。你的老师出去了。她在寻找的是递归。您可以不使用递归和内置函数或方法编写:
#!/usr/bin/python
lst = [3, 8, 1, 2, 0, 4, 8, 5]
minval=-2**64
largest=[]
def enum(lst):
for i in range(len(lst)):
yield i,lst[i]
for x in range(3):
m=minval
m_index=None
for i,j in enum(lst):
if j>m:
m=j
m_index=i
if m_index:
largest=largest+[m_index]
lst[m_index]=minval
print largest
这很有效。它很聪明。带上那个老师!!!但是,你会得到C或更低
或者——你可以成为老师的宠儿。按她想要的方式写。您将需要列表的递归最大值。剩下的很简单
def max_of_l(l):
if len(l) <= 1:
if not l:
raise ValueError("Max() arg is an empty sequence")
else:
return l[0]
else:
m = max_of_l(l[1:])
return m if m > l[0] else l[0]
print max_of_l([3, 8, 1, 2, 0, 4, 8, 5])
当我尝试的时候,没有太多尝试…真的想不出来你需要的答案只有len或range吗?@akaRem这些是考试中唯一允许使用的内置选项。@Omerta:如果你把它分解成步骤,用伪代码做算法,应该不会那么困难。想想你如何手动找到一个列表中最高的3项。啊,我讨厌老师使用这种限制。我从标准库中获得了重新实现的功能,可以更轻松地构思简单的任务,但这类事情只是懒惰,而且教人坏习惯。当我尝试的时候,尝试不多……真的想不出来你需要的答案只有len或range?@akaRem这些是考试中唯一允许使用的内置选项。@Omerta:如果你把它分解成步骤,用伪代码做算法,应该不会那么困难。想想你如何手动找到一个列表中最高的3项。啊,我讨厌老师使用这种限制。我从标准库中获得了重新实现的功能,这使得构思简单的任务变得更容易,但这种事情只是懒惰,而且会带来糟糕的实践。列表方法是不允许的,切片也是不允许的,即使在考试中也是如此。“老师对这些东西很着迷。@jamylak……这是第一学期的计算机科学课……教授关心的只是学习算法。”。教授不关心语法或内置。如果由教授决定,课堂将采用C语言授课。列表法是不允许的,切片法也是不允许的,即使在考试中也是如此。“老师对这些东西很着迷。@jamylak……这是第一学期的计算机科学课……教授关心的只是学习算法。”。教授不关心语法或内置。如果由教授决定,课程将用C语言授课。这也使用了一系列列表方法。。
.pop、append、\uuuuu contains\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。问题是j是to_watch中的一个项目,其最大的项目是lenlst。所以,j可以和lenlst一样大。idx被分配了j的值,然后您将该元素从to_watch中移除。如果j,因此idx等于lenlst,并且您已经删除了某些内容,那么您将有一个超出范围的索引。另外,我不清楚你是否真的删除了你首先要删除的索引…@akaRem-是的,我打错了。最大的项目是lenlst-1。但是,在del语句中可能使用的最大索引是lenlst-1,所以我的观点仍然是一样的。只要在OP提供的输入上尝试你的函数,你就会看到我得到了一个索引越界错误。@mgilson该算法在[9,1,2,3,4,5,6]中不起作用。答案是[0,0,0]——这是不对的。猜猜为什么!我已经改正了。现在工作得很好!甚至是改进的函数。这也使用了一系列列表方法…pop,append,_uucontains,uuu_u等等,我假设uu getitem_u_u_u_u_u______________________________。问题是j是to_watch中的一个项目,其最大的项目是lenlst。所以,j可以和lenlst一样大。idx被分配了j的值,然后您将该元素从to_watch中移除。如果j,因此idx等于lenlst,并且您已经删除了某些内容,那么您将有一个超出范围的索引。另外,我不清楚你是否真的删除了你首先要删除的索引…@akaRem-是的,我打错了。最大的项目是lenlst-1。但是,在del语句中可能使用的最大索引是lenlst-1,所以我的观点仍然是一样的。只要在OP提供的输入上尝试你的函数,你就会看到我得到了一个索引越界错误。@mgilson该算法在[9,1,2,3,4,5,6]中不起作用。答案是[0,0,0]——这是不对的。猜猜为什么!我已经改正了。现在工作得很好!甚至改进了函数。为什么非Python枚举如此复杂?def enum:for i in rangelenlst:为rangelenlst中的i生成i,lst[i]或甚至为rangelenlst中的i生成内联enum=i,lst[i]。但无论如何,enum对于禁止枚举是绝对等效的。@akaRem:我想可以这样做。然而,我并不想简明扼要。我喜欢你的mods…为什么这么复杂的非Python枚举?def enum:for i in rangelenlst:为rangelenlst中的i生成i,lst[i]或甚至为rangelenlst中的i生成内联enum=i,lst[i]。但无论如何,enum对于禁止枚举是绝对等效的。@akaRem:我想可以这样做。然而,我并不想简明扼要。我喜欢你的mods。。。