私がその目的を完全に誤解していない限り、関数にはいくつかの問題がありますが、取得したものから始めIndexError
ましょう。
これが発生するコードは次のとおりです。
for i in range(len(Users)):
c,d=Users[i]
if a==d:
Users.remove(Users[i])
print "Password deleted"
print Users
それで、ここで何が起こりますか?リストの長さをループし、パスワードが一致した場合は、現在のユーザーをリストから削除します。その後、以前に計算されたリストの長さを繰り返します。そのため、リストから項目を 1 つ削除すると、その長さは 1 つ減りますが、for ループは古い長さで繰り返します (range(len(Users))
がすぐに評価されるため)。そのため、リストから 1 人のユーザーを削除しただけの場合、 の最後の値はi
、リストに存在しなくなったアイテムにアクセスしようとします。
フォローアップとして直接発生する関連する問題があります。それは、ループ内の要素をスキップすることです。リストからアイテムを削除していますがi
、アイテムが削除されていない場合と同じように進んでいます。したがって、たとえば item を削除すると、1
新しいアイテムは1
以前のアイテムになり2
ます。に進むと2
、その項目はスキップされます。
では、これを修正するにはどうすればよいでしょうか。さて、さまざまな方法があります。代わりに while ループを作成し、そのインデックス付けを「従来の」方法で処理することができます (自分自身をインクリメントし、while 条件で常に長さをチェックします)。後で (ループ後に) 削除するアイテムを覚えておくために、2 つ目のリストを保持することもできます。しかし、あなたの場合、まったく違うことをするのは良い考えかもしれないと思います。
私があなたの機能をどのように理解したかから、単一のユーザーのパスワードを変更できるようにする何かを書きたいと思っています。したがって、現在のパスワードを入力してから新しいパスワードを入力すると、リスト内のユーザーのエントリが更新されます。これは、現時点であなたのバージョンで起こっていることではありません。あなたの機能は次のとおりです。
- 現在のパスワードを尋ねる
- 一致するパスワードを持つすべてのユーザーを削除します
- リストの最後のユーザーが入力されたパスワードを持っていない場合は、「正しくありません」と出力します ( の最後の値のみが表示
d
されるため、最後のユーザーのみがチェックされます)。
- 新しいパスワードを要求する
- ユーザー リストを再度ループし、最後のユーザーのみを保存します (繰り返しますが
c
、d
ループ後に最後の値が含まれます)。
- 最後のユーザーが入力したのと同じパスワードを持っていた場合 (なぜそれを確認したいのか、新しいパスワードを入力したいのですか)、まったく同じユーザーを追加します (
i
再びリストの最後のインデックスを指しているため)。リスト。
ご覧のとおり、おそらく意図されていない、いくつかの奇妙なことが起こっています。おそらく代わりにやりたいことは、次のようなものです。
- 現在のパスワードを尋ねる
- そのパスワードのユーザーを見つける
- 新しいパスワードを尋ねる
- リストから古いユーザーを削除します
- 変更されたユーザーをリストに追加する
だから多分このようなもの:
oldPassword = raw_input('Enter your old password to continue:\n') # 1
found = False
for name, password in Users:
if password == oldPassword: # 2
found = True
break
if found:
newPassword = raw_input('Enter new password:\n') # 3
Users.remove((name, password)) # 4
Users.append((name, newPassword)) # 5
else:
print 'Incorrect password'