2

リスト内の数字/文字/単語のすべての出現を検索し、元のリストでそれらのインデックスを返すために再帰を使用する必要がある宿題があります。以前に回答した質問をこのサイトで検索しましたが、回答が見つかりませんでした。最初の出現が見つかった後でもリストのチェックを続行するオプションを使用した再帰について。

かなりこのように見えるはずです:

>>> find_value( [4,7,5,3,2,5,3,7,8,6,5,6], 5)
[2,5,10]

これまでの私のコードは次のようになります。

def find_all(x,y):
    if len(x) == 1 and x[0] == y:
        return [i for i, y in enumerate(x)]
    return find_all(x[1:],y)

リストを最小化するだけで、インデックスと同じ[0]が表示されますが、分割されたリストの場合は、元のインデックスを取得できません。ありがとうございます。これがすでに存在する場合は、申し訳ありません。私は検索しましたが見つかりませんでした。

4

4 に答える 4

2

単純な非再帰的なソリューションは次のとおりです。

def find_value(l, lookfor):
    return [i for i, v in enumerate(l) if v == lookfor]

宿題のアドバイスとして、次のオプションの3番目の引数としてリストの進行状況を渡しますfind_all

def find_value(list, lookfor, position=0)

...そしてpositionあなたが繰り返すたびに1を追加します。

于 2012-11-17T14:31:26.913 に答える
1

宿題を割り当てるポイントは、通常、問題を調査してそこから学ぶことができるようにすることです。この場合、初心者にとって通常難しいのは再帰です。

再帰のポイントは、小さな問題の解決策から大きな問題に対する答えを構築することです。したがって、可能な限り小さいものから始めるのが最善です。

def find_all(haystack, needle):
    if not haystack:
        # no occurrences can happen
        return []

リストが空でない場合は、最初の要素が探しているものであるかどうかを確認できます。

    if haystack[0] == needle:
        occurrences = [0] # the index of the first element is always 0
    else:
        occurrences = []

また、より小さな問題の解決策も必要になります。

    recursive_occurences = find_all(haystack[1:], needle)

ここで気付いた問題は、返されるインデックスが常に0であるということです。これは、それらが小さいリストのインデックスであるためです。アイテムが0小さいリストにインデックスを持っている場合、それは最大のリストにあるそのインデックスが実際にあることを意味します1(これはあなたのプログラムが欠けていた主要な部分です)、したがって:

    for x in recursive_occurences:
        occurrences.append(x+1)

そして、完全な答えを返します:

    return occurrences

これが少しお役に立てば幸いです。そうすれば、次の宿題を自分で行うことができます。

于 2012-11-17T15:31:28.833 に答える
0

ここにいくつかの解決策があります:

一気に、醜いですが、機能しています:

def find_value(lst, elt):
    return [x + 1 
            for x in ([] if not lst else 
                      (([-1] if lst[0] == elt else []) +
                       find_value(lst[1:], elt)))]

よりきれいですが、隠されたインデックスパラメータがあります:

def find_value(lst, elt, idx=0):
    return [] if not lst else \
           (([idx] if lst[0] == elt else []) +
            find_value(lst[1:], elt, idx + 1))

かなり?、内部再帰関数で長い...より保守しやすい?

def find_value(lst, elt):
    def _rec(lst, elt, idx):
         if not lst:
             return []
         res = [idx] if lst[0] == elt else []
         return res + _rec(lst[1:], elt, idx + 1)
    return _rec(lst, elt, idx=0)
于 2012-11-17T14:58:58.727 に答える
0

再帰を使用して割り当てを解決している場合でも、この問題には非常に簡単な解決策があります。

>>> def find_value(array, value):
    *head, tail = array
    array = find_value(head, value) if head else []
    return array + [len(head)] if tail == value else array

>>> find_value([4, 7, 5, 3, 2, 5, 3, 7, 8, 6, 5, 6], 5)
[2, 5, 10]
>>> 
于 2012-11-17T15:38:31.473 に答える