Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取列表中X最大数的索引_Python_Algorithm - Fatal编程技术网

Python 获取列表中X最大数的索引

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

请不要使用除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[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。。。