1

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
4

4 に答える 4

5

リストから最初の 3 (x) の数字を取得します。最大値に対する最小値はこれらです。あなたの場合: 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 に多くの変化がありますが、その後はまれになります。もちろん、トラバースするときは、最後の位置 (3、4、5、...) についても記録しておく必要があります。

上位 N 要素の挿入ソートは、かなりパフォーマンスが高いはずです。

これは Scala での同様の問題ですが、インデックスを報告する必要はありません。

于 2012-05-12T02:50:30.287 に答える
1

解決策を投稿するのが良いかどうかはわかりませんが、これはうまくいくようです:

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コードのすべての行を説明しようとしました。

于 2012-05-12T02:55:46.587 に答える
1

リストメソッドを使用できますか? (例: , append? )。もしそうなら、これはうまくいくはずです(私は思う...)sortindex

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)
于 2012-05-12T03:12:56.207 に答える
1

お前。これには2つの方法があります。

最初の方法は賢くなることです。あなたの先生をフィックアウトしてください。彼女が探しているのは再帰です。これは、再帰なし、組み込み関数またはメソッドなしで記述できます。

#!/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])        
于 2012-05-12T03:59:29.600 に答える