1

重複の可能性:
Pythonのリストで値の最初と最後のインデックスを見つける

こんにちは私は誰かがPythonで私を助けてくれるかどうか疑問に思っていました。リスト内のアイテムの最後の出現の最後のインデックスを再帰的に返すコードを作成しようとしています。したがって、リスト[1,2,3,4,5,2]の最後は。を返す必要があり4ます。リストと検索対象のアイテムの2つの変数のみを取ります。一致する変数が見つからない場合は、を返します-1

これまでのところ私はこれを持っています:

def lstIndex(lst, item):
    if len(lst) == 0:
        return -1
    place = lst[0]
    if place == item:
        print(place)
        #just return the index
        return lst.index(place)
    else:
        return lstIndex(lst[1:],item)
4

5 に答える 5

3

再帰が必要ない場合は、これを使用できます。

def find_last(lst,item):
    try:
       return len(lst) - next(i for i,elem in enumerate(reversed(lst),1) if elem == item)
    except StopIteration:
       return -1


a = [1,2,3,4,5,4,3]
idx = find_last(a,4)
print a[idx]
print find_last(a,6)
于 2012-10-20T03:53:21.180 に答える
3

短い反復ソリューション:

try:
    return (len(lst)-1) - lst[::-1].index(item)
except ValueError:
    return -1

しかし、あなたは明示的に再帰的な解決策を探しているので、それを再帰的に行う方法を紹介します。ただし、効率的ではありません。素敵で効率的なPythonicソリューションが必要な場合は、他の人が示したような反復ソリューション(または上記のもの)を使用する必要があります。

実際にこれを行うにはいくつかの方法があります。値が見つかった最後のインデックスを指定する追加の引数を取るヘルパー関数を使用できます。

def list_rfind(lst, item):
    def list_rfind_helper(i, item, last=-1):
        if i >= len(lst): return last
        if lst[i] == item: last = i
        return list_rfind_helper(i+1, item, last)

    return list_rfind_helper(0, item)

ヘルパー関数なしでそれを行うことができます:

def list_rfind(lst, item):
    if not lst:
        return -1

    res = list_rfind(lst[1:], item)
    if res >= 0:
        return res+1
    elif lst[0] == item:
        return 0
    else:
        return -1
于 2012-10-20T04:03:25.277 に答える
1
lst = [1, 2, 3, 4, 3, 4]

findLast(lst, 4)

def findLast(lst, item):
    for i, val in enumerate(reversed(lst)):
        if val == item:
            return len(lst) - (i + 1)  # Return index of matched item

    return -1
于 2012-10-20T03:54:44.993 に答える
1

完全を期すために:

def list_rfind(lst, item):
    return (len(lst)-1) - sum(1 for _ in iter(reversed(lst).next, item))
于 2012-10-20T04:26:52.677 に答える
0

私はあなたが何を望んでいるかを100%知っているとは確信していません. 「... [1,2,3,4,5,2] のリストで最後に 4 を返す必要がある」というあなたの声明は、私を少し混乱させました。指定した の最後の出現のインデックスを返したいと思いますitem。したがって、指定されたリストの結果が 4 であるためには、item5 でなければなりません。

他の場所で述べたように、ここでは再帰関数は最も効率的または Pythonic なソリューションではありません。nneonneo's answerの最初のような解決策をお勧めします。

ただし、再帰的でなければならない場合は、以下のコードで必要なものが得られると思います。( を使用して) 前からリストをステップ実行する代わりに、再帰呼び出しでリストを渡すときに、インデックス範囲として[1:]を使用して後方にステップ実行する必要があります。[:-1]

def lstIndex(lst, item):
    if len(lst) == 0:
        return -1
    elif lst[-1] == item:
        return len(lst) - 1
    else:
        return lstIndex(lst[0:-1], item)

私は以下でテストしました:

the_list = [1,2,3,4,5,2]
print lstIndex(the_list, 2)
print lstIndex(the_list, 1)
print lstIndex(the_list, 3)
print lstIndex(the_list, 4)
print lstIndex(the_list, 5)
print lstIndex(the_list, 6)
print lstIndex(the_list, 0)

次の出力を使用します。

5
0
2
3
4
-1
-1

于 2012-10-20T04:31:08.477 に答える