Próbuję sprawdzić, czy lst2 jest odwrotnością lst1. W poniższym kodzie dlaczego zwraca True musi znajdować się poza instrukcją if. Kiedy umieszczam else: return False z instrukcją if, oba ...

3
Khoi Nguyen 28 czerwiec 2021, 02:03

4 odpowiedzi

Najlepsza odpowiedź

Jeśli umieścisz go w if, tj. w tej samej warunkowości co return False, ale po nim, to nigdy nie zostanie wykonane, ponieważ funkcja zawsze będzie miała pierwszy return. Lub zawsze będzie wykonywany wewnątrz if, wcześniej, pozostawiając go iw ten sposób niezamierzenie nadpisując zamierzony False. Wydaje się, że właśnie to obserwujesz.

Jeśli umieścisz go w pętli (ale poza if), zostanie on wykonany podczas pierwszej iteracji pętli, czyli o wiele za wcześnie.

Jeśli umieścisz go w pętli, ale z else, nadal zostanie wykonany zbyt wcześnie. w pierwszym przypadku nie False. To wciąż nie jest to, czego chcesz, ponieważ potrzebujesz True tylko wtedy, gdy w pętli nie ma False, a nie już w pierwszym przypadku nie False.

Chcesz zwrócić prawdziwą wartość logiczną tylko wtedy, gdy pętla przejdzie całkowicie bez wywołania False. Chcesz tego, ponieważ w przeciwnym razie możesz przegapić przypadki False.

Właśnie dlatego pozycja, którą opisujesz i używasz w pokazanym kodzie, poza if i pętlą, jest jedynym poprawnym sposobem.

3
Yunnosch 28 czerwiec 2021, 05:08

To podejście jest lżejszą metodą niż podejście brute force.

Brute force druga lista jest odwracana, a następnie porównywane są wszystkie elementy obu list. To dużo zmarnowanych zasobów, zwłaszcza jeśli listy są bardzo długie.

Podejście podane w twoim Q wykorzystuje wskaźnik, który zasadniczo pozwala ci „wcześniej zatrzymać”. Zamiast sortować drugą listę, przeprowadź iterację elementów i porównaj je. Jeśli pasują, przejdź do kolejnych elementów. Jeśli się nie zgadzają, ucieknij wcześnie i return False. Przy takim podejściu nie można zwrócić True, dopóki wszystkie elementy na listach nie zostaną porównane. (Dlatego return True znajduje się poza pętlą for.)

2
Yaakov Bressler 27 czerwiec 2021, 23:25

Instrukcja return natychmiast zatrzymuje wykonywanie funkcji lub metody.

W ten sposób twoja funkcja zatrzymuje się na pierwszej różnicy i zwraca False. Jeśli wszystkie testowane elementy są równe, pętla kończy się bez tej instrukcji return False i kontynuuje z następną instrukcją, którą jest return True .

1
zwitsch 27 czerwiec 2021, 23:28

Nie jestem pewien, czy to jest dokładnie to, czego potrzebujesz, ale jest to sposób na sprawdzenie, czy l1 jest takie samo jak l2 odwrócone.

l1 = [1, 2, 3]
l2 = [3, 2, 1]
l2.reverse()

if l1 == l2:
    print("Yes")
else:
    print("No")
0
A.M. Ducu 27 czerwiec 2021, 23:09