7

シーケンス 's' で最後に出現するアイテム 'x' を見つけたい、または何も存在せず、最初のアイテムの位置が 0 の場合は None を返したい

これは私が現在持っているものです:

def PositionLast (x,s):

    count = len(s)+1
    for i in s:
        count -= 1
        if i == x:
           return count
    for i in s:
        if i != x:
           return None

私がしようとすると:

>>>PositionLast (5, [2,5,2,3,5])
>>> 4

これが正解です。ただし、「x」を 5 ではなく 2 に変更すると、次のようになります。

>>>PositionLast(2, [2,5,2,3,5])
>>> 5

ここでの答えは 2 です。これがどのように発生しているのか混乱しています。修正する必要があることを誰かが説明できれば幸いです。また、可能な限り最も基本的なコードでこれを完成させたいと思います。

ありがとうございました。

4

8 に答える 8

6

効率的に行うには、リストを逆の順序で列挙し、最初に一致したアイテムのインデックスを返します (またはデフォルトで)。たとえば、次のようになります。None

def PositionLast(x, s):
    for i, v in enumerate(reversed(s)):
        if v == x:
            return len(s) - i - 1  # return the index in the original list
    return None

スライス表記 (例: s[::-1]) を使用してリストを反転することは避けてください。これは、メモリ内に新しい反転リストが作成されるためです。これはタスクには必要ありません。

于 2015-12-23T15:34:52.150 に答える
3

i==x関数の末尾に余分なループがある場合にカウントを返すため、ロジックが正しくありません。

代わりに、リストの enumerate の逆形式をループして、最初に出現したインデックスを返します。

def PositionLast (x,s):
    return next(i for i,j in list(enumerate(s))[::-1] if j == x)

デモ:

print PositionLast (2, [2,5,2,3,5,3])
2
print PositionLast (3, [2,5,2,3,5,3])
5
print PositionLast (5, [2,5,2,3,5,3])
4
于 2015-12-23T15:36:39.337 に答える
2

あなたのコードは間違っています。最初からリストをチェックし、最初の一致で停止しています。あなたが望むのは、リストを逆の順序でチェックすることです。

def PositionLast (x,s):
    count = len(s)
    for i in s[::-1]:
        count -= 1
        if i == x:
            return count
    return None

あなたの最初の行は偶然のためだけにあなたに正しい答えを与えます
:
- 2 番目のアイテムをチェックするときに 4 をカウントし、一致してから 4 を返し
ます。 - 偶然にも、これは最後のアイテムのインデックスです。

于 2015-12-23T15:39:52.603 に答える
2

リストを逆順に繰り返し、x をチェックします。リストを逆にして最初からインデックスを見つけることはリソースを大量に消費するため、これは効率的な方法です。

def PositionLast (x,s):
    for i in range(len(s)-1,0,-1):
        if s[i] == x:
            return i
    return None
于 2015-12-23T15:40:42.427 に答える
1
def positionLast(x, L):
    answer = None
    for i,e in enumerate(L):
        if e==x: answer = i
    return answer
于 2015-12-23T15:34:16.063 に答える